我有一个测试程序,如果它可以依赖于在Windows上按严格优先级顺序调度的线程,那么它会简单得多。我看到一个低优先级的线程与更高优先级的线程一起运行,并想知道是否发生了这种情况,因为不同的线程正在不同的处理器核心上进行调度。
有没有办法强制进程中的所有Win32线程使用单个处理器核心? SetThreadAffinityMask看起来可能很有趣,但其文档并不完全清楚,我不确定如何使用它。
答案 0 :(得分:5)
SetThreadAffinityMask函数:为指定的线程设置处理器关联掩码。
http://msdn.microsoft.com/en-us/library/windows/desktop/ms686247%28v=vs.85%29.aspx
SetThreadAffinityMask(GetCurrentThread(), (1 << CoreNumber));
将当前线程与'CoreNumber'变量
的亲缘关系设置为答案 1 :(得分:0)
即使你强制所有线程都放在一个虚拟处理器上,你仍然会经常运行低优先级线程,等待它们的高优先级线程(priority inversion)。一旦一个线程由windows-scheduler调度,它就会一直运行,直到它被抢占或休眠(或其他一些睡眠诱导系统调用)。您将不得不更改应用程序的设计,以便它不再假定没有低优先级的线程运行,而高优先级的线程也可以运行。