2019独角兽企业重金招聘Python工程师标准>>>

Linux系统提供API函数sched_setaffinity和sched_getaffinity用于设置或获取线程的可以使用的CPU核。

int sched_setaffinity(pid_t pid, unsigned int cpusetsize, cpu_set_t
*mask);

这个函数中pid表示需要设置或获取绑定信息的线程id(或进程id),如果为0,表示对当前调用的线程进行设置;第2个参数cpusetsize一般设置为sizeof(cpu_set_t),用以表示第3个参数指向的内存结构对象的大小;第3个参数mask指向类型为cpu_set_t对象的指针,用以设置或获取指定线程可以使用的CPU核列表。Linux提供函数CPU_ZERO、CPU_SET和CPU_ISSET对cpu_set_t类型的对象进行操作,其中CPU_ZERO用于清空cpu_set_t类型对象的内容,CPU_SET用于设置cpu_set_t类型对象,CPU_ISSET用于判断cpu_set_t类型对象与核对应的位是否被设置。下面通过简单的代码示例来说明这两个函数的具体用法。

设置线程绑定代码:

cpu_set_t mask;

int blist[8]={2, 5, 13, 9, 3, 6, 7, 4}; //设置需要绑定的核列表

#pragma omp parallel private(mask)

{

CPU_ZERO(&mask);

CPU_SET(blist[omp_get_thread_num()], &mask); //对每个线程设置绑定方案

sched_setaffinity(0,sizeof(cpu_set_t), &mask);

}

该段代码将paralle
region里面的8个线程依次绑定到核2,5,13,9,3,6,7,4。同样可以使用sched_getaffinity函数获取线程的能够使用的核的列表,示例代码如下:

int num_processors = sysconf(_SC_NPROCESSORS_CONF); //获取当前节点核的数目

cpu_set_t get;

int i = 0;

CPU_ZERO(&get);

sched_getaffinity(0, sizeof(cpu_set_t), &get); //获取当前调用线程的可以使用的核

for(i = 0; i < num_processors; i++)

{

if(CPU_ISSET(i, &get))

{

printf(“The current thread %d bound to core %d\n“,
omp_get_thread_num(), i);

}

}

下面是一个完整的例子

文件bind.c

#include<stdlib.h>

#include<stdio.h>

#include<sys/types.h>

#include<sys/sysinfo.h>

#include<unistd.h>

#define __USE_GNU

#include<sched.h>

#include<ctype.h>

#include<string.h>

#include<pthread.h>

#define THREAD_MAX_NUM 100  //1个CPU内的最多进程数

int num=0;  //cpu中核数

void* threadFun(void* arg)  //arg  传递线程标号(自己定义)

{

cpu_set_t mask;  //CPU核的集合

cpu_set_t get;   //获取在集合中的CPU

int *a = (int *)arg;

printf("the a is:%d\n",*a);  //显示是第几个线程

CPU_ZERO(&mask);    //置空

CPU_SET(*a,&mask);   //设置亲和力值

if (sched_setaffinity(0, sizeof(mask), &mask) ==
-1)//设置线程CPU亲和力

{

printf("warning: could not set CPU affinity,
continuing...\n");

}

while (1)

{

CPU_ZERO(&get);

if (sched_getaffinity(0, sizeof(get), &get) ==
-1)//获取线程CPU亲和力

{

printf("warning: cound not get thread affinity,
continuing...\n");

}

int i;

for (i = 0; i < num; i++)

{

if (CPU_ISSET(i, &get))//判断线程与哪个CPU有亲和力

{

printf("this thread %d is running
processor : %d\n", i,i);

}

}

}

return NULL;

}

int main(int argc, char* argv[])

{

num = sysconf(_SC_NPROCESSORS_CONF);  //获取核数

pthread_t thread[THREAD_MAX_NUM];

printf("system has %i processor(s). \n", num);

int tid[THREAD_MAX_NUM];

int i;

for(i=0;i<num;i++)

{

tid[i] = i;  //每个线程必须有个tid[i]

pthread_create(&thread[0],NULL,threadFun,(void*)&tid[i]);

}

for(i=0; i< num; i++)

{

pthread_join(thread[i],NULL);//等待所有的线程结束,线程为死循环所以CTRL+C结束

}

return 0;

}

编译命令:gcc bind.c -o bind -lpthread

执行:./bind

输出结果:略

特别注意:

#define __USE_GNU不要写成#define _USE_GNU

#include<pthread.h>必须写在#define __USE_GNU之后,否则编译会报错

查看你的线程情况可以在执行时在另一个窗口使用top -H来查看线程的情况,查看各个核上的情况请使用top命令然后按数字“1”来查看。

转载于:https://my.oschina.net/shuinian/blog/119248

多线程编程之线程绑定处理器核相关推荐

  1. 多线程编程之三——线程间通讯

    七.线程间通讯 一般而言,应用程序中的一个次要线程总是为主线程执行特定的任务,这样,主线程和次要线程间必定有一个信息传递的渠道,也就是主线程和次要线程间要进行通信.这种线程间的通信不但是难以避免的,而 ...

  2. C#多线程编程实例 线程与窗体交互

    C#多线程编程实例 线程与窗体交互 代码: public partial class Form1 : Form{//声明线程数组Thread[] workThreads = new Thread[10 ...

  3. 多线程编程(2): 线程的创建、启动、挂起和退出

    python多线程编程(2): 线程的创建.启动.挂起和退出 如上一节,python的threading.Thread类有一个run方法,用于定义线程的功能函数,可以在自己的线程类中覆盖该方法.而创建 ...

  4. 多线程编程:线程死锁的原因以及解决方法

    多线程编程:线程死锁的原因以及解决方法 关于线程死锁这个问题相信程序员在编写多线程程序时会经常遇到的一个经典问题,这种情况往往出现在多个线程同时对临界资源访问时所产生的. 属于临界资源的硬件有打印机. ...

  5. Python多线程编程之线程子类化

    Python多线程编程之线程子类化 基本思路 Threading模块简介 **MyThread**主要代码 实例 所有代码 运行结果 基本思路 导入Threading模块下的Thread类,将其子类化 ...

  6. Win32多线程编程(2) — 线程控制

    Win32线程控制只有是围绕线程这一内核对象的创建.挂起.恢复.终结以及通信等操作,这些操作都依赖于Win32操作系统提供的一组API和具体编译器的C运行时库函数.本篇围绕这些操作接口介绍在Windo ...

  7. java多线程同步与死锁,廖雪峰Java11多线程编程-2线程同步-3死锁

    在多线程编程中,要执行synchronized块,必须首先获得指定对象的锁. 1.Java的线程锁是可重入的锁 public void add(int m){ synchronized (lock){ ...

  8. 多线程编程之四——线程的同步

     八.线程的同步 虽然多线程能给我们带来好处,但是也有不少问题需要解决.例如,对于像磁盘驱动器这样独占性系统资源,由于线程可以执行进程的任何代码段,且线程的运行是由系统调度自动完成的,具有一定的不确定 ...

  9. Win32多线程编程(3) — 线程同步与通信

    一.线程间数据通信 系统从进程的地址空间中分配内存给线程栈使用.新线程与创建它的线程在相同的进程上下文中运行.因此,新线程可以访问进程内核对象的所有句柄.进程中的所有内存以及同一个进程中其他所有线程的 ...

最新文章

  1. 相关算子、卷积算子、边缘效应
  2. python空集_玩转Python集合,这一篇就够了!
  3. 1、spring的IOC
  4. 二十九、PHP框架Laravel学习笔记——Debugbar 调试器
  5. 《新一代人工智能发展白皮书(2017年)》重磅发布(100页完整版PPT)
  6. python图像分类代码_Kaggle—So Easy!百行代码实现排名Top 5%的图像分类比赛
  7. echart纵坐标标签特别长换行显示
  8. python网络爬虫系列教程_Python网络爬虫系列教程连载 ----长期更新中,敬请关注!...
  9. python版本时间_python 获取文件版本号和修改时间
  10. c语言如何用数组对字符串排序,怎么用qsort对二维字符数组存的若干字符串排序...
  11. Python的类与对象
  12. 2020年华为杯中国研究生数学建模出结果时间
  13. 锐捷linux网卡,CentOS 7安装MentoHUSTt锐捷认证程序
  14. ubuntu下安装QQ
  15. 通过系统日志采集大数据
  16. Leetcode-845. 数组中的最长山脉(最详细解法)
  17. Redis的Mster/Slaver
  18. 计算机科学的刊物卷号,期刊的卷号和期号怎么看
  19. 华硕Z99jc安装win7出现安装程序无法定位现有系统分区,也无法创建新的系统分区解决办法...
  20. 计算机学后感作文400,考试后的感想作文400字(精选10篇)

热门文章

  1. 全球最大医疗器械公司在中国寻找移动医疗新机会
  2. linux死锁检测的一种思路【转】
  3. 基于CentOS中PXE网络环境构建实例
  4. 在IOS开发中根据(id)sender获取UIButton的信息
  5. windows下postgreSQL服务接收远程客户连接
  6. 《网络安全协议》课程实验大纲
  7. 职业经理人的核心技能
  8. 利用现有资源快速实现汉语专用分词系统
  9. 1.08亿条在线赌场信息泄露,来源指向 ElasticSearch
  10. Excel万年历的制作