Linux CPU线程绑核

news/2025/3/12 12:23:08/

 

        为了加快程序的运行速度和充分利用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.h>void *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


http://www.ppmy.cn/news/1082417.html

相关文章

构造函数和析构函数(个人学习笔记黑马学习)

构造函数:主要作用在于创建对象时为对象的成员属性赋值&#xff0c;构造函数由编译器自动调用&#xff0c;无须手动调用。析构函数:主要作用在于对象销毁前系统自动调用&#xff0c;执行一些清理工作。 #include <iostream> using namespace std;//对象初始化和清理class…

VS + QT 封装带UI界面的DLL

一、创建编译DLL的项目 1.新建Qt Class Liabrary 2.新建项目&#xff0c;选择Qt Widgets Class 3.新建C类&#xff0c;可以在此类里面写算法函数用于调用。 4.下面是添加完Qt窗体类和C类之后的项目截图 5.修改头文件并编译 将uidemo_global.h中的ifdef内容复制到dialog.h上…

Ajax与jQuery

目录 Ajax是一种异步无刷新的技术 Ajax的优点&#xff1a; 可以无需刷新页面与服务器端进行通信允许根据用户事件来更新部分页面内容 Ajax的缺点&#xff1a; 没有浏览历史&#xff0c;不能回退存在跨域问题&#xff08;同源&#xff09;SEO&#xff08;搜索引擎优化&#x…

软考A计划-网络工程师-复习背熟-数据通信基础和局域网技术

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

NLP(六十七)BERT模型训练后动态量化(PTDQ)

本文将会介绍BERT模型训练后动态量化&#xff08;Post Training Dynamic Quantization&#xff0c;PTDQ&#xff09;。 量化 在深度学习中&#xff0c;量化&#xff08;Quantization&#xff09;指的是使用更少的bit来存储原本以浮点数存储的tensor&#xff0c;以及使用更少的…

【进阶篇】MySQL分库分表详解

文章目录 0. 前言1. 垂直分库分表2. 水平分库分表 1. 理解过程及实现方案问题讨论衍生出分库分表策略借助成熟组件使用分库分表阶段完成后面临的问题1. 异地多活问题2. 数据迁移问题3. 分布式事务问题4. join查询的问题 分库分表的策略实现示例 2. 参考文档 0. 前言 假设有一个…

【配置环境】Visual Studio 配置 OpenCV

目录 一&#xff0c;环境 二&#xff0c;下载和配置 OpenCV 三&#xff0c;创建一个 Visual Studio 项目 四&#xff0c;配置 Visual Studio 项目 五&#xff0c;编写并编译 OpenCV 程序 六&#xff0c;解决CMake编译OpenCV报的错误 一&#xff0c;环境 Windows 11 家庭中…

001图机器学习与图神经网络简介

文章目录 一. 无处不在的图二. 如何对图数据做信息挖掘三. 图神经网络四. 图机器学习常用的编程工具五. 图的可视化工具六. 常见的图数据库七. 图机器学习的应用举例八. 结束语 一. 无处不在的图 一切具有关联关系的数据都可以用图来表示。比如&#xff1a;交通网、知识图谱、…