Linux 在使用sched_setaffinity将线程固定到核心后,如何取消固定线程?
我目前正在使用将线程固定到特定的CPU核心Linux 在使用sched_setaffinity将线程固定到核心后,如何取消固定线程?,linux,multithreading,process,Linux,Multithreading,Process,我目前正在使用将线程固定到特定的CPU核心 void setCpuAffinity(int id) { cpu_set_t cpuset; CPU_ZERO(&cpuset);
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之前获取现有掩码,这是一个很好的建议。我试试看。