如何利用网站新闻做推广,ppt下载免费完整版,呼叫中心系统厂家排名,临安营销型网站建设为了加快程序的运行速度和充分利用CPU资源#xff0c;我们可以人为将不同线程绑定在不同的cup上#xff0c;例如有两个线程A,B#xff0c;其中A已经在CPU0上运行#xff0c;并且CPU0上还有其他的任务#xff0c;那么我们可以将线程B绑到CPU1上#xff0c;这样就可以减轻C… 为了加快程序的运行速度和充分利用CPU资源我们可以人为将不同线程绑定在不同的cup上例如有两个线程A,B其中A已经在CPU0上运行并且CPU0上还有其他的任务那么我们可以将线程B绑到CPU1上这样就可以减轻CPU0的负担从而充分利用多核CPU。原来是一个CPU做两件事现在两个CPU同时做两个事使效率更高。 看下下面的代码
#define _GNU_SOURCE
#include sched.h //这两个头文件是一起的#include stdio.h
#include stdlib.h
#include string.h
#include unistd.h
#include pthread.hvoid *myfun(void *arg)
{cpu_set_t mask;cpu_set_t get;CPU_ZERO(mask);CPU_SET(1, mask);if (pthread_setaffinity_np(pthread_self(), sizeof(mask), mask) 0) {fprintf(stderr, set thread affinity failed\n);}CPU_ZERO(get);if (pthread_getaffinity_np(pthread_self(), sizeof(get), get) 0) {fprintf(stderr, get thread affinity failed\n);}if (CPU_ISSET(1, get)) {printf(thread %lu is running in processor 1\n, (long unsigned)pthread_self());}pthread_exit(NULL); //退出线程
}int main(int argc, char *argv[])
{pthread_t tid; //用来创建新的线程cpu_set_t mask; //用来设置cpu_set_t get; //用来获int num sysconf(_SC_NPROCESSORS_CONF); //获取CPU核数printf(system has %d processor(s)\n, num);if (pthread_create(tid, NULL, (void *)myfun, NULL) ! 0) //创建线程 myfun为入口函数{fprintf(stderr, thread create failed\n);return -1;}CPU_ZERO(mask); //初始化某个CPU集设置为空CPU_SET(0, mask); //将某个CPU加入到这个CPU集合里这里是也可以理解为绑定CPU这里是CPU0if (pthread_setaffinity_np(pthread_self(), sizeof(mask), mask) 0) //pthread_self()获得线程自身ID{ //设置某一线程运行在某个CPU上fprintf(stderr, set thread affinity failed\n);}CPU_ZERO(get);if (pthread_getaffinity_np(pthread_self(), sizeof(get), get) 0) { //查看某一个CPU上有哪些线程fprintf(stderr, get thread affinity failed\n);}if (CPU_ISSET(0, get)) { //判断某个CPU是不是在CPU集里这里为CPU0printf(thread %lu is running in processor 0\n, (long unsigned)pthread_self());}pthread_join(tid, NULL); //等待线程return 0;
} 编译一下
gcc cpu.c -pthread thread 139946778752832 is running in processor 0 thread 139946770462464 is running in processor 1 可以看到我们将两个线程分别绑在了不同的CPU上面。
这里总结一下用到的基本函数
void CPU_ZERO (cpu_set_t *set); //初始化设为空void CPU_SET (int cpu, cpu_set_t *set); //将某个cpu加入cpu集中 void CPU_CLR (int cpu, cpu_set_t *set); //将某个cpu从cpu集中移出 int CPU_ISSET (int cpu, const cpu_set_t *set); //判断某个cpu是否已在cpu集中设置了int pthread_setaffinity_np(pthread_t thread,size_t cpusetsize,const cpu_set_t *cpuset); //设置CPUint pthread_getaffinity_np(pthread_t thread,size_t cpusetsize, cpu_set_t *cpuset); //查看CPU