zoukankan      html  css  js  c++  java
  • Linux将线程绑定到CPU内核运行

    先介绍三个函数

    一、pthread_setafftinity_np

    在Linux上,我们可以使用pthread特定的pthread_setafftinity_np函数。通过设置其亲和性将每个线程固定到单个CPU

      //设置CPU亲和度,为0表示设置成功,非0值表示失败
                    int rc =pthread_setaffinity_np(p[i].native_handle(),sizeof(cpu_set_t), &cpuset);

    第一个参数是线程的句柄,第二个参数是CPU集合的大小,第三个参数是CPU集合的地址

    线程和内核绑定成功返回值为0,失败返回一个非0值

    二、sysconf(_SC_NPROCESSORS_CONF);

    //获取电脑CPU内核的数量
    
    int cpu_num;
    cpu_num = sysconf(_SC_NPROCESSORS_CONF);
    cout<<"cpu_num="<<cpu_num<<endl;

    三、cpu_set_t结构体

    cpu_set_t这个结构体了。这个结构体的理解类似于select中的fd_set,可以理解为cpu集,也是通过约定好的宏来进行清除、设置以及判断:
     
    有下列几种操作
    //初始化,设为空
    void CPU_ZERO (cpu_set_t *set); 
    //将某个cpu加入cpu集中 
    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);

    完整代码

    #include <stdio.h>
    #include <iostream>
    #include <thread>
    #include <pthread.h>
    #include <mutex>
    #include <unistd.h>
     using namespace std;
     mutex _mutex;
     void func(int id,int cnt)
     {
            {
                    lock_guard<mutex> lg(_mutex);
                    cout<< "Thread id=  " << id << ":running on CPU " <<sched_getcpu() << endl;
            } 
        while (1) {
    
        }
    }
    
    int main()
    {
            int cpu_num;
               cpu_num = sysconf(_SC_NPROCESSORS_CONF);
               cout<<"cpu_num="<<cpu_num<<endl;
            thread p[4];
            for(int i=0;i<4;i++){
    
                    
                    p[i]=thread(func,i,10);
                    //cpu_set_t这个结构体了。这个结构体的理解类似于select中的fd_set,可以理解为cpu集,也是通过约定好的宏来进行清除、设置以及判断:
                    cpu_set_t cpuset;
                    //初始化,设为空
                    CPU_ZERO(&cpuset);
                    //将某个cpu加入cpu集中 
                    CPU_SET(i,&cpuset);
    
                    //设置CPU亲和度,为0表示设置成功,非0值表示失败
                    int rc =pthread_setaffinity_np(p[i].native_handle(),sizeof(cpu_set_t), &cpuset);
                    if(rc!=0){
                            cout<<"SET  CPU ERROR!
    ";
                    }
    
                
            }
            for(int i=0;i<4;i++){
                    p[i].join();
            }
            return 0;
     
    }

    将4个线程绑定在第一个和第三个CPU内核运行

    将4个线程绑定在各自对应的4个CPU内核运行

  • 相关阅读:
    脑洞大开的爬虫解决思路 转载:https://mp.weixin.qq.com/s/Bd-wz_RiRpYv8ufIbQTZDg
    js逆向某东滑块 转载 https://mp.weixin.qq.com/s/eZSTfduYS63-LOvkAofxqA
    不能爬小程序,叫什么会爬虫 【参考资料也要看】 https://mp.weixin.qq.com/s/oDG3k_qjMZaoygZmz9OUDw
    HDU6042 Journey with Knapsack
    HDU7073 Integers Have Friends 2.0
    CF1439C Greedy Shopping
    CF813E Army Creation
    POJ1322 Chocolate
    CF451E Devu and Flowers
    POJ3734 Blocks
  • 原文地址:https://www.cnblogs.com/-citywall123/p/13389522.html
Copyright © 2011-2022 走看看