我想确保线程被移动到特定的 CPU 核心,并且调度程序永远不能从它移动。
有SetThreadAffinityMask()
电话,但没有GetThreadAffinityMask()
。
我需要这个的原因是,如果调度程序将该线程移动到另一个 CPU,高分辨率计时器会变得混乱。
我想确保线程被移动到特定的 CPU 核心,并且调度程序永远不能从它移动。
有SetThreadAffinityMask()
电话,但没有GetThreadAffinityMask()
。
我需要这个的原因是,如果调度程序将该线程移动到另一个 CPU,高分辨率计时器会变得混乱。
您可能应该只使用 SetThreadAffinityMask 并相信它正在工作。
如果您可以调用一个函数,该函数返回一个数字,该数字指示线程正在哪个 CPU 上运行,而不使用关联,那么一旦函数返回,答案通常会是错误的。因此,在以提升的 IRQL 运行的内核代码之外,检查返回的掩码SetThreadAffinityMask()
与您将获得的一样接近,甚至这正在发生变化。
听起来您正在尝试解决RDTSC
时钟偏差问题。如果您RDTSC
直接使用该指令,请考虑QueryPerformanceCounter()
改为调用:
QueryPerformanceCounter()
如果芯片组支持并且在系统的 ACPI 表中,则在 Windows Vista 上使用HPET 。QueryPerformanceCounter()
,但这对于RDTSC
直接使用的应用程序没有任何作用。AMD Dual-Core Optimizer是针对直接使用的应用程序的 hack ,RDTSC
但如果时钟偏差量由于 C1 时钟斜坡(在 C1 电源状态下时钟速度降低)而发生变化,您仍然会有时钟偏差。而且这些实用程序可能不是很普遍,因此使用affinity withQueryPerformanceCounter()
仍然是一个好主意。肯说的。但是,如果您不相信它正在工作,您可以再次调用 SetThreadAffinityMask,并确认返回值与您期望的掩码匹配。(但是当然,如果你不信任这个函数,那么你就不能信任第二个调用......)
不要被 GetProcessAffinityMask 的存在弄糊涂了。该函数不是用来验证 SetProcessAffinityMask 是否有效,但例如,您可以构造一个线程亲缘关系,它是进程亲缘关系的子集。
只需查看返回值并验证它不是 0 就可以了。
不需要 Get Thread AffinityMask。只需获取 Get Process AffinityMask 的值,关闭一些位,然后调用 SetThreadAffinityMask。线程继承进程的关联掩码,并且由于它们的关联在您的控制之下,您已经知道线程的关联掩码(它是您设置的那个)。