有时,当我运行这个简单的程序时
#include <Windows.h>
DWORD WINAPI ThreadStart(LPVOID)
{
for (;;) { }
return 0;
}
int _tmain()
{
SetPriorityClass(GetCurrentProcess(), BELOW_NORMAL_PRIORITY_CLASS);
SYSTEM_INFO si;
GetSystemInfo(&si);
for (DWORD i = si.dwNumberOfProcessors * 2; i > 0; i--)
{ CloseHandle(CreateThread(NULL, 0, &ThreadStart, NULL, 0, NULL)); }
Sleep(INFINITE);
}
我经常观察到不公平的线程调度,例如:
并非每次运行都不公平,但是当它时,它会在应用程序的整个生命周期中保持不公平。
为什么会发生这种情况,避免这种情况的正确方法是什么?
最佳答案
一些选项:
如果(且仅当)您运行的是 Windows 7/8 64 位(非 32 位)或 Windows Server 2008 R2 或更高版本,您可以完全绕过系统调度程序并且自己处理这件事,虽然这不是一件小事!
是described on MSDN here称为用户模式调度 (UMS)。
下面来自 MSDN 的部分屏幕截图 - 这对您有用吗?
此外,在您的 BIOS 中禁用超线程(如果适用)可能是个好主意,因为对于 Windows 如何区分逻辑内核和物理内核存在一些争论。 See here for a discussion .
还有一些函数可用,例如 SetThreadAffinityMask()
( MSDN here ) 和 SetThreadIdealProcessor()
这可能会有所帮助,尽管我个人认为这是一个有点碰运气。更常见的情况是我损害了整体吞吐量而不是帮助它。
关于c - Windows线程调度器不公平?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16453951/