linux - 使用 sched_setaffinity 固定到核心后如何取消固定线程?

标签 linux multithreading process

我目前正在使用 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/

相关文章:

linux - 如何使用爬虫解析文档

linux - 是什么杀死了我的进程,为什么?

linux - shellscript遍历字母

linux - 如何在 CentOs 中使用命令行杀死所有打开的终端

python - 从音频文件生成波形图像

c - 有没有办法从同一进程中的另一个线程查看一个线程的寄存器内容?

c - 使用 uint32_t 和 GCC 原子指令 union 32 位结构

c++ - Qt 中不同线程上的信号/插槽 OpenCV Mat

c - 如何在给定时刻创建线程

java - 如何使用进程在目录中运行 jar 文件