2011-03-29 64 views
1

我有1500個線程..我希望他們能夠在12個處理器上運行... 要做到這一點,我打電話給 SetThreadAffinityMask(GetCurrentThread(),1<<(threadnum%numprocessors)); numprocessors = 12。 是否正確使用了面罩? 它需要可擴展性,也就是說,如果我希望它只在11個處理器上運行,那麼 SetThreadAffinityMask(GetCurrentThread(),1<<(threadnum%numprocessors));其中numprocessors = 11。SethreadAffinityMask()正確的用法?

回答

2

句法SetThreadAffinityMask(GetCurrentThread(),1 < <(GetThreadId()%numprocessors))這是正確的,但它不只是因爲你有很多線程和處理器的使用親和力是一個好主意。它可能會干擾調度程序並降低性能。您可以將其用於某些線程以最小化緩存未命中。當一個線程從一個處理器移到另一個處理器時,會發生緩存未命中。

5

這是正確的。

但是出於性能和效率的原因,我建議你改變你的線程模型,不知何故線程數量等於CPU執行核心數量,然後這些線程在你的1500個任務/工作項目上工作「任務管理器」。

,如果你不希望創建自己的「任務管理器」,你可以使用windows ThreadPool API,你把任務分配給被O管理的「線程池」/S