Drecik學習經驗分享
轉載請註明出處:http://blog.csdn.net/drecik__/article/details/8096253
默認情況下,Windows Vist或以後版本在給線程分配CPU時,使用軟關聯,即如果其他因素一樣,系統將是線程在上一次運行的處理器上運行。
Windows還支持硬關聯,即可以控制線程在某些特定CPU上運行(如果有多個CPU的話),可以使用SetProcessAffinityMask來限制進程上的線程只在可用CPU的一個子集上運行:
BOOL SetProcessAffinityMask(
HANDLE hProcess, // 進程句柄;
DWORD_PTR dwProcessAffinityMask // 關聯性掩碼,表示在那些CPU上運行, 每一位代表一個CPU;
);
還可以返回關聯性的掩碼,GetProcessAffinityMask:BOOL GetProcessAffinityMask(
HANDLE hProcess, // 進程句柄;
PDWORD_PTR lpProcessAffinityMask, //進程掩碼,總是下面系統掩碼的一個真子集;
PDWORD_PTR lpSystemAffinityMask // 系統掩碼,表示系統哪個CPU上可以運行該進程上的線程;
);
通過SetThreadAffinityMask可以限制一個線程的關聯性:// 返回值是線程之前的掩碼;
DWORD_PTR SetThreadAffinityMask(
HANDLE hThread, // 線程句柄;
DWORD_PTR dwThreadAffinityMask // 關聯性掩碼;
);
下面給出個例子,假設有4個CPU,現在限制Thread0只能在CPU1上運行,Thread1,2,3只運行在CPU1,CPU2和CPU3上:SetThreadAffinityMask( hThread0, 0x00000001 );
SetThreadAffinityMask( hThread1, 0x0000000E );
SetThreadAffinityMask( hThread2, 0x0000000E );
SetThreadAffinityMask( hThread3, 0x0000000E );
在任務管理器中可以手動更改進程與CPU的關聯性,右鍵單擊一個進程選擇設置相關性就可以在彈出的對話框中進行設置。