7

我想确保线程被移动到特定的 CPU 核心,并且调度程序永远不能从它移动。

SetThreadAffinityMask()电话,但没有GetThreadAffinityMask()

我需要这个的原因是,如果调度程序将该线程移动到另一个 CPU,高分辨率计时器会变得混乱。

4

4 回答 4

10

您可能应该只使用 SetThreadAffinityMask 并相信它正在工作。

MSDN

于 2008-10-02T19:09:35.533 回答
4

如果您可以调用一个函数,该函数返回一个数字,该数字指示线程正在哪个 CPU 上运行,而不使用关联,那么一旦函数返回,答案通常会是错误的。因此,在以提升的 IRQL 运行的内核代码之外,检查返回的掩码SetThreadAffinityMask()与您将获得的一样接近,甚至这正在发生变化

听起来您正在尝试解决RDTSC时钟偏差问题。如果您RDTSC直接使用该指令,请考虑QueryPerformanceCounter()改为调用:

  • QueryPerformanceCounter()如果芯片组支持并且在系统的 ACPI 表中,则在 Windows Vista 上使用HPET 。
  • 如果您调用 ,使用AMD 处理器驱动程序的基于 AMD 的系统将主要补偿多核时钟偏差QueryPerformanceCounter(),但这对于RDTSC直接使用的应用程序没有任何作用。AMD Dual-Core Optimizer是针对直接使用的应用程序的 hack ,RDTSC但如果时钟偏差量由于 C1 时钟斜坡(在 C1 电源状态下时钟速度降低)而发生变化,您仍然会有时钟偏差。而且这些实用程序可能不是很普遍,因此使用affinity withQueryPerformanceCounter()仍然是一个好主意。
于 2008-10-03T03:57:31.207 回答
3

肯说的。但是,如果您不相信它正在工作,您可以再次调用 SetThreadAffinityMask,并确认返回值与您期望的掩码匹配。(但是当然,如​​果你不信任这个函数,那么你就不能信任第二个调用......)

不要被 GetProcessAffinityMask 的存在弄糊涂了。该函数不是用来验证 SetProcessAffinityMask 是否有效,但例如,您可以构造一个线程亲缘关系,它是进程亲缘关系的子集。

只需查看返回值并验证它不是 0 就可以了。

于 2008-10-02T20:12:31.967 回答
1

不需要 Get Thread AffinityMask。只需获取 Get Process AffinityMask 的值,关闭一些位,然后调用 SetThreadAffinityMask。线程继承进程的关联掩码,并且由于它们的关联在您的控制之下,您已经知道线程的关联掩码(它是您设置的那个)。

于 2008-10-02T20:21:03.410 回答