我目前正在使用 sched_setaffinity
将线程固定到特定的 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 固定的影响并再次允许线程自由移动?
我知道一个 hack 是使用 CPU_OR
并将每个 CPU ID 添加到允许的集合中,但我正在寻找一种不太 hacky 的方法来将线程的状态恢复到状态在调用 sched_setaffinity
之前。
最佳答案
根据@phs的建议,我写了下面两个函数,分别在cpu pinning之前和之后调用来unpin线程。这成功取消了 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;
}
关于linux - 使用 sched_setaffinity 固定到核心后如何取消固定线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24500695/