我想确保线程被移动到特定的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()
的亲和性仍然是个好主意
不要被GetProcessAffinityMask的存在所迷惑。该函数不是用来验证SetProcessAffinityMask是否有效的,但例如,这样你就可以构建一个线程亲和性,它是进程亲和性的子集。
只要看看返回值并验证它不是0,你就应该没事了。
不需要Get线程仿射掩码。只需获取getProcessAffinityMask的值,关闭一些位,然后调用SetThreadAffinityMask。线程继承进程的关联掩码,由于它们的关联在您的控制之下,您已经知道线程的关联掩码(即您将其设置为的掩码)。