1. 程式人生 > >SetThreadAffinityMask中掩碼的問題

SetThreadAffinityMask中掩碼的問題

在我們進行多執行緒開發的過程時,常常需要自己分配執行緒到不同的處理器上運算,以保證我們程式的執行效率。SetThreadAffinityMask是我們常見的選擇。
1.MSDN中函式的定義

DWORD_PTR WINAPI SetThreadAffinityMask(
  _In_ HANDLE    hThread,
  _In_ DWORD_PTR dwThreadAffinityMask
);

引數hThread就是我們在使用傳進去執行緒的控制代碼,dwThreadAffinityMask就是我們要傳入的處理器掩碼
2.掩碼常見問題
0x00000001,折就是一個最常見的處理器掩碼,這個就是代表使用第一個處理器,如下圖所示的i5雙核心四執行緒的處理器CPU0(邏輯上的第一個)。0x00000008就是代表在CPU3(邏輯上的第四個)上執行
這裡寫圖片描述


對於以前的電腦大多都是這樣雙核心四執行緒,我來解釋下8核處理器及更多cpu核心的是如何分配到後四個處理器上的
這裡寫圖片描述
如上圖所示,一個32核cpu,當我們想使用
第6個cpu執行執行緒時,那麼掩碼就是0x00000020
第7個cpu執行執行緒時,那麼掩碼就是0x00000040
第8個cpu執行執行緒時,那麼掩碼就是0x00000080
第5個和第7個cpu執行執行緒時,那麼掩碼就是0x00000050
第7個和第8個cpu執行執行緒時,那麼掩碼就是0x000000C0
第2個和第7個和第8個cpu執行執行緒時,那麼掩碼就是0x000000C2
第2個和第4個和第7個和第8個cpu執行執行緒時,那麼掩碼就是0x000000CA
以此類推