SethreadAffinityMask()正确用法?

时间:2011-03-29 05:29:24

标签: c++ multithreading affinity setthreadaffinitymask

我有1500个线程..我想让它们在12个处理器上运行...... 要做到这一点,我打电话 SetThreadAffinityMask(GetCurrentThread(),1<<(threadnum%numprocessors));其中numprocessors = 12。 这是正确使用面具吗? 它需要是可扩展的,即如果我希望它只在11个处理器上运行,那么 SetThreadAffinityMask(GetCurrentThread(),1<<(threadnum%numprocessors));其中numprocessors = 11。

2 个答案:

答案 0 :(得分:5)

这是正确的。

但是出于性能和效率的原因,我建议您以某种方式更改线程模型,使线程数等于CPU执行核心数,然后这些线程处理您的1500个任务/工作项,由您的“任务经理“。

如果您不想创建自己的“任务管理器”,可以使用Windows ThreadPool API,将任务分配给由O / S管理的“线程池”

答案 1 :(得分:2)

语法上SetThreadAffinityMask(GetCurrentThread(),1&lt;&lt;(GetThreadId()%numprocessors))这是正确的,但仅仅因为你有很多线程和处理器而使用亲和力并不是一个好主意。它可能会干扰调度程序并降低性能。您可以将此用于某些线程,以最大限度地减少缓存未命中。当线程从一个处理器移动到另一个处理器时,会发生缓存未命中。