c++ - 正确使用 SetThreadAffinityMask

标签 c++ multithreading

有 12 个核心和 12 个线程在运行。我想为每个核心绑定(bind) 1 个线程。这就是我在每个线程开头所说的。

int core=12;
SetThreadAffinityMask(GetCurrentThread(),(1<<core)-1);

这就是我所拥有的......我不知道这是否是正确的称呼方式。我不确定我是否理解第二个参数的工作原理..

我还需要调用 SetProcessaffinitymask 吗?

最佳答案

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

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

请注意 David Heffernan 的回答中的警告:除非您知道如何善用亲和性,否则最好不要玩亲和性。除了 David 已经提到的原因之外,我将在具有不同数量的套接字、内核和超线程的计算机之间添加应用程序可移植性。

关于c++ - 正确使用 SetThreadAffinityMask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5919699/

相关文章:

c++ - tinycthread编译错误

multithreading - Pyspark并行ml.KMeans覆盖彼此的K

c++ - 如何在模板构造函数中知道模板类型

c++ - IXMLDOMDocument::selectNodes 无法按预期工作

c++ - MFC中不断增加进度条

python - 使用 asyncio 有两个无限任务

c++ vector 和sizeof

c++ - 模板类和类属性也是模板

c++ - std::forward 转发函数

C - 杀死线程分支