首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确使用SetThreadAffinityMask

正确使用SetThreadAffinityMask
EN

Stack Overflow用户
提问于 2011-05-07 15:26:18
回答 4查看 21.4K关注 0票数 10

有12个核心,和12个线程运行..我想绑定一个线程到每个核心。这是我在每个线程开始时调用的。

代码语言:javascript
复制
int core=12;
SetThreadAffinityMask(GetCurrentThread(),(1<<core)-1);

这就是我所知道的……我不知道这是不是合适的叫法。我不确定我是否理解了第二个参数是如何工作的。

我还需要调用SetProcessaffinitymask吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-05-07 15:52:15

SetThreadAffinityMask()的第二个参数是位向量。每一位对应一个逻辑处理器:一个CPU核心或一个超线程。如果第二个参数中的位设置为1,则允许线程在相应的内核上运行。

对于等于12的core,掩码(1<<core)-1包含0..11位设置,因此允许每个线程在12个核心中的任何一个上运行。假设您希望将每个线程设置为在专用内核上运行。为此,您需要每个线程都有一个介于0和11之间的唯一数字,并且只设置亲和性掩码的相应位。提示:您可以使用InterlockedIncrement()来获取唯一编号。或者,如果你的线程都是在一个循环中启动的,那么唯一的数字是已知的(它是循环行程计数),你可以使用它,例如,传递给每个线程作为参数,或者为同一个循环中的新线程设置亲和性。

请注意大卫·赫弗南回答中的谨慎之处:除非你知道如何永远使用亲和力,否则最好不要玩弄亲和力。除了David已经提到的原因之外,我还将在具有不同数量的套接字、内核和超线程的计算机之间添加应用程序可移植性。

票数 9
EN

Stack Overflow用户

发布于 2011-05-07 15:37:39

您似乎正在为所有12个处理器设置亲和性,这并不是您想要的。

在主线程中,我会遍历设置亲和性的所有12个线程。不要在线程内部设置亲和性,因为这需要线程知道它的索引,而它通常不需要知道。我会声明一个掩码变量,并将其赋值为1。每次循环时,您都会设置线程亲和性,然后移位1。您不应该更改进程亲和性。

一句忠告。设置亲和性是危险的。如果用户更改了进程亲和性,那么您可能会得到一个不能在任何处理器上运行的线程。注意。

此外,根据我的经验,手动设置亲和性没有任何性能优势,有时速度会更慢。通常情况下,系统运行得很好。

票数 8
EN

Stack Overflow用户

发布于 2012-04-06 14:39:17

你可以像下面这样写代码。GetThreadHandle(i)是获取每个线程的句柄的函数。

代码语言:javascript
复制
int core = 12;
for(int i=0; i<core; i++)  
  SetThreadAffinityMask(GetThreadHandle(i), 1<<i);
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5919699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档