Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在使用sched_setaffinity将线程固定到核心后,如何取消固定线程?_Linux_Multithreading_Process - Fatal编程技术网

Linux 在使用sched_setaffinity将线程固定到核心后,如何取消固定线程?

Linux 在使用sched_setaffinity将线程固定到核心后,如何取消固定线程?,linux,multithreading,process,Linux,Multithreading,Process,我目前正在使用将线程固定到特定的CPU核心 void setCpuAffinity(int id) { cpu_set_t cpuset; CPU_ZERO(&cpuset);

我目前正在使用将线程固定到特定的CPU核心

void setCpuAffinity(int id) {                                            
    cpu_set_t cpuset;                                                    

    CPU_ZERO(&cpuset);                                                   
        CPU_SET(id, &cpuset);                                            
        assert(sched_setaffinity(0, sizeof(cpuset), &cpuset) == 0);      
}                                                                        
不幸的是,我找不到相应的函数来从任何给定的内核中取消绑定线程,并允许内核在任何内核上调度线程

如何扭转CPU固定的效果,并再次允许线程自由移动?


我知道有一种破解方法是使用
CPU\u或
并将每个CPU ID添加到允许的集合中,但我正在寻找一种不那么破解的方法,将线程的状态恢复到调用
sched\u setaffinity
之前的状态。

根据@phs的建议,我编写了以下两个函数,在cpu固定到取消固定线程之前和之后调用。这将成功地解除固定CPU

void setCpuAffinity(cpu_set_t cpuset) {                                
    assert(sched_setaffinity(0, sizeof(cpuset), &cpuset) == 0);        
}                                                                      

cpu_set_t getCpuAffinity() {                                             
    cpu_set_t cpuset;                                                    

    CPU_ZERO(&cpuset);                                                   
    assert(sched_getaffinity(0, sizeof(cpuset), &cpuset) == 0);          
    return cpuset;                                                       
}                                                                        

sched_setaffinity
似乎正在设置掩码,而不是选择CPU。设置最宽容的面具?@phs,这就是我在问题底部描述的黑客行为。“最宽容的面具”似乎没有一个干净的说法。啊,的确如此。为什么不在调用
sched_setaffinity
?@phs之前获取现有掩码,这是一个很好的建议。我试试看。