设置cpu亲和力demo

这是一个关于多线程编程的实验,通过创建多个线程并分配不同的内存,同时设置线程CPU亲和性。每个线程进行内存分配与释放操作,观察性能和内存使用情况。实验中使用了`pthread`库,`sched.h`用于设置CPU亲和性,并通过`ustime`函数记录时间戳来衡量性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <sys/time.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/epoll.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <sys/types.h>
#define __USE_GNU
#include <sched.h>
#include <ctype.h>
#include <pthread.h>
#define MAX_N1  3
#define MAX_N2  1
#define MAX_N3  0
#define MAX_N4  0
#define MAX_N5  0

#define LOOP_NUM 1000*1000*1000
#define gettid() syscall(__NR_gettid)

#define MAXEPOLLSIZE 100
int gaiefd[MAX_N1];


typedef struct thdparam {
    unsigned int uiNum;
    unsigned long ulLoop;
    unsigned int tid;
	int imalloclen;
    unsigned char szInfo[32];    
} thdparam;

long long ustime(void) {
    struct timeval tv;
    long long ust;

    gettimeofday(&tv, NULL);
    ust = ((long)tv.tv_sec)*1000000;
    ust += tv.tv_usec;
    return ust;
}




int *thread_fun1(void *arg)
{
    long long t1,t2,diff;
    struct thdparam *parg = arg;

    unsigned int uiNum = 500;//(parg->uiNum + 3)*100;
    unsigned long aulMem[10240];
	int imalloclen = parg->imalloclen;
    unsigned int uiLoop;
    unsigned long ulCount = 0;
    int i;
	void *p;
    t1 = ustime();
	
    while(1)
    {
        for (i = 0; i < 1000; i++)
		{
            ulCount ++;
            p = malloc(imalloclen);
			aulMem[i] = p;
			
			if ((ulCount&0xFFFF)==0)
            {
				
                t2 = ustime();
                diff = t2-t1;
                t1 = ustime();
                printf("tid %d malloclen %d %lu,diff %llu\n", parg->tid, imalloclen, ulCount, diff);
				ulCount = 1;
				return NULL;
            }
		}
		
		for (i = 0; i < 1000; i++)
		{
			free(aulMem[i]);
		}
		

    }
    
    return NULL;
}



void setparam(pthread_attr_t * pattr, unsigned int cpuindex)
{
    cpu_set_t cpu_info;
    pthread_attr_init(pattr);
        
    CPU_ZERO(&cpu_info);
    CPU_SET(cpuindex, &cpu_info);
    if (0!=pthread_attr_setaffinity_np(pattr, sizeof(cpu_set_t), &cpu_info))
    {
        printf("set affinity failed");
        return;
    }
}


int main(int argc, char ** argv)
{
    unsigned int i = 0;
    unsigned int cpuindex = 0;
	int imalloclen = atoi(argv[1]);
    cpu_set_t cpu_info;
    int cpu_num = (int)sysconf(_SC_NPROCESSORS_ONLN);
    printf("The number of cpu is %d\n", cpu_num);
   

    struct thdparam astharg[MAX_N1];
    pthread_t thid1[MAX_N1];
    pthread_attr_t attr1[MAX_N1];
    for (i = 0; i < MAX_N1 ; i++)
    {
        cpuindex++;
        setparam(attr1+i, cpuindex);

        astharg[i].uiNum = i;
        astharg[i].ulLoop = LOOP_NUM;
		astharg[i].tid = i;
		astharg[i].imalloclen = imalloclen;
        //sprintf(astharg[i].szInfo, "f1V1T%dL%lu\n",i,astharg[i].ulLoop/(1000*1000));
        
        (void)pthread_create(&thid1[i], attr1+i,(void *)thread_fun1,astharg + i);
    }
    

    

    while(1)
    {
        //printf("diff_main %lu %lu\n",*pulValue1, *pulValue2);
        sleep(50);
    }
    
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值