代码之家  ›  专栏  ›  技术社区  ›  hyperlogic

在Win32上,如何将线程移动到另一个CPU核心?

  •  6
  • hyperlogic  · 技术社区  · 16 年前

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

    有一个 SetThreadAffinityMask() 打电话,但没有 GetThreadAffinityMask() .

    我之所以需要这样做是因为如果调度器将线程移动到另一个CPU,高分辨率计时器将变得一团糟。

    4 回复  |  直到 11 年前
        1
  •  9
  •   Ken    16 年前

    您可能只需要使用sethreadaffityMask并相信它正在工作。

    MSDN

        2
  •  4
  •   bk1e    16 年前

    如果您可以调用一个函数,该函数返回一个指示线程在哪个CPU上运行的数字,而不使用关联性,那么一旦函数返回,答案通常是错误的。所以检查返回的掩码 SetThreadAffinityMask() 尽可能接近,在提升的IRQL上运行的内核代码之外,以及 even that's changing .

    听起来你好像在努力工作 RDTSC 时钟偏差问题。如果您正在使用 RDSTC 直接指令,考虑调用 QueryPerformanceCounter() 而是:

    • 查询性能计数器() 在Windows Vista上使用 HPET 如果芯片组支持,并且在系统的ACPI表中。
    • 基于AMD的系统使用 AMD Processor Driver 如果您调用 查询性能计数器() ,但这对使用 RDSTC 直接。这个 AMD Dual-Core Optimizer 是对使用 RDSTC 直接,但是如果由于c1时钟倾斜(在c1电源状态下时钟速度降低),时钟偏移量会发生变化,那么您仍然会有时钟偏移。而且这些实用程序可能不太广泛,因此使用 查询性能计数器() 还是个好主意。
        3
  •  3
  •   matli    16 年前

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

    不要被getprocessaffinityMask的存在混淆。该函数不用于验证setProcessAffinityMask是否工作,但例如,您可以构造一个线程关联,它是进程关联的一个子集。

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

        4
  •  1
  •   tzot    16 年前

    不需要GeT 螺纹 亲和素只需获取get的值 过程 affinityMask,关闭一些位,然后调用sethreadaffityMask。线程继承进程的关联掩码,由于它们的关联受您的控制,因此您已经知道线程的关联掩码(它是您设置的)。