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