linux线程绑定

不管是线程还是进程,都是通过设置亲和性(affinity)来达到目的。
    与进程的情况相似,线程亲和性的设置和获取主要通过下面两个函数来实现:
int pthread_setaffinity_np(pthread_tthread, size_t cpusetsize,const cpu_set_t *cpuset);
int pthread_getaffinity_np(pthread_t thread, size_t cpusetsize, cpu_set_t *cpuset);
    从函数名以及参数名都很明了,唯一需要点解释下的可能就是cpu_set_t这个结构体了。这个结构体的理解类似于select中的fd_set,可以理解为cpu集,也是通过约定好的宏来进行清除、设置以及判断:
[cpp] view plain copy
 
  1. //初始化,设为空  
  2. void CPU_ZERO (cpu_set_t *set);   
  3. //将某个cpu加入cpu集中   
  4. void CPU_SET (int cpu, cpu_set_t *set);   
  5. //将某个cpu从cpu集中移出   
  6. void CPU_CLR (int cpu, cpu_set_t *set);   
  7. //判断某个cpu是否已在cpu集中设置了   
  8. int CPU_ISSET (int cpu, const cpu_set_t *set);   
cpu集可以认为是一个掩码,每个设置的位都对应一个可以合法调度的 cpu,而未设置的位则对应一个不可调度的 CPU。换而言之,线程都被绑定了,只能在那些对应位被设置了的处理器上运行。通常,掩码中的所有位都被置位了,也就是可以在所有的cpu中调度。       

使用函数pthread_attr_setaffinity_np

 

[cpp] view plain copy
 
  1. #include <stdio.h>  
  2. #include <pthread.h>  
  3. #include <unistd.h>  
  4.   
  5. int GetCpuCount()  
  6. {  
  7.     return (int)sysconf(_SC_NPROCESSORS_ONLN);  
  8. }  
  9.   
  10. void *thread_fun()  
  11. {  
  12.     int i;  
  13.     while(1)  
  14.     {  
  15.         i = 0;  
  16.     }  
  17.   
  18.     return NULL;  
  19. }  
  20.   
  21. int main()  
  22. {  
  23.     int cpu_num = 0;  
  24.     cpu_num  = GetCpuCount();  
  25.     printf("The number of cpu is %d\n", cpu_num);  
  26.   
  27.     pthread_t t1;  
  28.     pthread_t t2;  
  29.     pthread_attr_t attr1;  
  30.     pthread_attr_t attr2;  
  31.   
  32.     pthread_attr_init(&attr1);  
  33.     pthread_attr_init(&attr2);  
  34.   
  35.     cpu_set_t cpu_info;  
  36.     __CPU_ZERO(&cpu_info);  
  37.     __CPU_SET(0, &cpu_info);  
  38.     if (0!=pthread_attr_setaffinity_np(&attr1, sizeof(cpu_set_t), &cpu_info))  
  39.     {  
  40.         printf("set affinity failed");  
  41.         return;  
  42.     }  
  43.   
  44.     __CPU_ZERO(&cpu_info);  
  45.     __CPU_SET(1, &cpu_info);  
  46.     if (0!=pthread_attr_setaffinity_np(&attr2, sizeof(cpu_set_t), &cpu_info))  
  47.     {  
  48.         printf("set affinity failed");  
  49.     }  
  50.   
  51.     if (0!=pthread_create(&t1, &attr1, thread_fun, NULL))  
  52.     {  
  53.         printf("create thread 1 error\n");  
  54.         return;  
  55.     }  
  56.   
  57.     if (0!=pthread_create(&t2, &attr2, thread_fun, NULL))  
  58.     {  
  59.         printf("create thread 2 error\n");  
  60.         return;  
  61.     }  
  62.   
  63.     pthread_join(t1, NULL);  
  64.     pthread_join(t2, NULL);  
  65. }  

 

使用函数pthread_setaffinity_np

 

[cpp] view plain copy
 
  1. #include <stdio.h>  
  2. #include <pthread.h>  
  3. #include <unistd.h>  
  4.   
  5. int GetCpuCount()  
  6. {  
  7.     return (int)sysconf(_SC_NPROCESSORS_ONLN);  
  8. }  
  9.   
  10. void *thread_fun()  
  11. {  
  12.     int i;  
  13.     while(1)  
  14.     {  
  15.         i = 0;  
  16.     }  
  17.   
  18.     return NULL;  
  19. }  
  20.   
  21. int main()  
  22. {  
  23.     int cpu_num = 0;  
  24.     cpu_num  = GetCpuCount();  
  25.     printf("The number of cpu is %d\n", cpu_num);  
  26.   
  27.     pthread_t t1;  
  28.     pthread_t t2;  
  29.     pthread_attr_t attr1;  
  30.     pthread_attr_t attr2;  
  31.   
  32.     pthread_attr_init(&attr1);  
  33.     pthread_attr_init(&attr2);  
  34.   
  35.     if (0!=pthread_create(&t1, &attr1, thread_fun, NULL))  
  36.     {  
  37.         printf("create thread 1 error\n");  
  38.         return;  
  39.     }  
  40.   
  41.     if (0!=pthread_create(&t2, &attr2, thread_fun, NULL))  
  42.     {  
  43.         printf("create thread 2 error\n");  
  44.         return;  
  45.     }  
  46.   
  47.     cpu_set_t cpu_info;  
  48.     __CPU_ZERO(&cpu_info);  
  49.     __CPU_SET(0, &cpu_info);  
  50.     if (0!=pthread_setaffinity_np(t1, sizeof(cpu_set_t), &cpu_info))  
  51.     {  
  52.         printf("set affinity failed");  
  53.     }  
  54.   
  55.     __CPU_ZERO(&cpu_info);  
  56.     __CPU_SET(1, &cpu_info);  
  57.     if (0!=pthread_setaffinity_np(t2, sizeof(cpu_set_t), &cpu_info))  
  58.     {  
  59.         printf("set affinity failed");  
  60.     }  
  61.   
  62.     pthread_join(t1, NULL);  
  63.     pthread_join(t2, NULL);  
  64. }  
posted @ 2017-07-28 10:04  Andy.gbhu  阅读(615)  评论(0)    收藏  举报