2014-07-01 32 views
0

我正在使用sched_setaffinity將線程固定到特定的CPU內核。如何在使用sched_setaffinity固定到核心後解鎖一個線程?

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_OR和每一個CPU ID添加到允許設定,但我正在尋找能恢復線程的狀態的狀態不太哈克方法之前sched_setaffinity是有史以來叫。

+0

'sched_setaffinity'似乎設置了掩碼,而不是選擇CPU。設置最寬容的面具? – phs

+0

@phs,這將是我在問題底部描述的黑客行爲。似乎沒有一個乾淨的方式來說「最寬容的面具」。 – merlin2011

+0

啊,就這樣。爲什麼不在調用'sched_setaffinity'之前獲取現有的掩碼呢? – phs

回答

1

使用@phs的建議,我編寫了以下兩個函數,在cpu pinning之前和之後調用該函數以取消固定線程。這成功地取消了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;              
}                   
相關問題