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



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

有一个SetThreadAffinityMask()调用,但没有GetThreadAffinityMask()

我需要这样做的原因是,如果调度程序将线程移动到另一个CPU,那么高分辨率计时器就会出错。

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

MSDN

如果您可以调用一个函数,该函数返回一个指示线程在哪个CPU上运行的数字,而不使用亲和性,那么函数一返回,答案往往是错误的。因此,在以提升的IRQL运行的内核代码之外,检查SetThreadAffinityMask()返回的掩码是非常接近的,甚至这一点也在改变。

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

  • 如果芯片组支持并且在系统的ACPI表中,则Windows Vista上的QueryPerformanceCounter()使用HPET
  • 如果您调用QueryPerformanceCounter(),使用AMD处理器驱动程序的基于AMD的系统将主要补偿多核时钟偏移,但这对直接使用RDTSC的应用程序没有任何作用。AMD双核Optimizer是直接使用RDTSC的应用程序的黑客,但如果由于C1时钟斜坡(在C1电源状态下时钟速度降低)而导致时钟偏移量发生变化,则仍然会出现时钟偏移。而且这些实用程序可能不是很普遍,所以使用QueryPerformanceCounter()的亲和性仍然是个好主意
肯说的话。但是,如果你不相信它在工作,你可以再次调用SetThreadAffinityMask,并确认返回值与你期望的掩码匹配

不要被GetProcessAffinityMask的存在所迷惑。该函数不是用来验证SetProcessAffinityMask是否有效的,但例如,这样你就可以构建一个线程亲和性,它是进程亲和性的子集。

只要看看返回值并验证它不是0,你就应该没事了。

不需要Get线程仿射掩码。只需获取getProcessAffinityMask的值,关闭一些位,然后调用SetThreadAffinityMask。线程继承进程的关联掩码,由于它们的关联在您的控制之下,您已经知道线程的关联掩码(即您将其设置为的掩码)。

相关内容

  • 没有找到相关文章

最新更新