我有1500个线程..我想让它们在12个处理器上运行......
要做到这一点,我打电话
SetThreadAffinityMask(GetCurrentThread(),1<<(threadnum%numprocessors))
;其中numprocessors = 12。
这是正确使用面具吗?
它需要是可扩展的,即如果我希望它只在11个处理器上运行,那么
SetThreadAffinityMask(GetCurrentThread(),1<<(threadnum%numprocessors));
其中numprocessors = 11。
答案 0 :(得分:5)
这是正确的。
但是出于性能和效率的原因,我建议您以某种方式更改线程模型,使线程数等于CPU执行核心数,然后这些线程处理您的1500个任务/工作项,由您的“任务经理“。
如果您不想创建自己的“任务管理器”,可以使用Windows ThreadPool API,将任务分配给由O / S管理的“线程池”
答案 1 :(得分:2)
语法上SetThreadAffinityMask(GetCurrentThread(),1&lt;&lt;(GetThreadId()%numprocessors))这是正确的,但仅仅因为你有很多线程和处理器而使用亲和力并不是一个好主意。它可能会干扰调度程序并降低性能。您可以将此用于某些线程,以最大限度地减少缓存未命中。当线程从一个处理器移动到另一个处理器时,会发生缓存未命中。