1

我有 1500 个线程..我希望它们在 12 个处理器上运行...为此我称之为 SetThreadAffinityMask(GetCurrentThread(),1<<(threadnum%numprocessors));其中处理器数 = 12。口罩的使用正确吗?它需要可扩展,也就是说,如果我希望它仅在 11 个处理器上运行,那么 SetThreadAffinityMask(GetCurrentThread(),1<<(threadnum%numprocessors));numprocessors=11。

4

2 回答 2

5

这是正确的。

但是出于性能和效率的原因,我建议您以某种方式更改线程模型,使线程数等于 CPU 执行核心的数量,然后这些线程在您的“任务管理器”分发的 1500 个任务/工作项上工作.

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

于 2011-03-29T06:18:03.117 回答
2

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

于 2011-03-29T05:55:07.303 回答