【问题标题】:On Win32 how do you move a thread to another CPU core?在 Win32 上,如何将线程移动到另一个 CPU 内核?
【发布时间】:2010-09-14 21:49:00
【问题描述】:

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

有一个SetThreadAffinityMask() 呼叫但没有GetThreadAffinityMask()

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

【问题讨论】:

  • 您不需要 GetThreadAffinityMask(),只需 SetThreadAffinityMask()。

标签: c++ c multithreading winapi multicore


【解决方案1】:

如果您可以调用一个函数,该函数返回一个数字,该数字指示线程正在哪个 CPU 上运行,而不使用亲和性,那么一旦函数返回,答案通常就会出错。因此,检查SetThreadAffinityMask() 返回的掩码与您将获得的一样接近,在以提升的 IRQL 运行的内核代码和even that's changing 之外。

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

  • Windows Vista 上的QueryPerformanceCounter() 使用HPET,如果它受芯片组支持并且在系统的ACPI 表中。
  • 如果您调用QueryPerformanceCounter(),使用AMD Processor Driver 的基于AMD 的系统将主要补偿多核时钟偏差,但这对于直接使用RDTSC 的应用程序没有任何作用。 AMD Dual-Core Optimizer 是针对直接使用 RDTSC 的应用程序的一个 hack,但如果时钟偏移量由于 C1 时钟斜坡(在 C1 电源状态下时钟速度降低)而发生变化,您仍然会有时钟偏移.而且这些实用程序可能不是很普遍,因此使用 QueryPerformanceCounter() 的关联性仍然是一个好主意。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

        MSDN

        【讨论】:

          猜你喜欢
          • 2023-04-02
          • 1970-01-01
          • 1970-01-01
          • 2013-07-02
          • 2017-08-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-13
          相关资源
          最近更新 更多