Windows线程调度程序是不公平的?

Meh*_*dad 6 c windows cpu winapi scheduler

有时候,当我运行这个简单的程序时

#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);
}
Run Code Online (Sandbox Code Playgroud)

我经常观察到不公平的线程调度,例如:

截图

这是不公平的每次运行,但是当它,它在整个应用程序生命周期保持不公平的.

为什么会发生这种情况,以及避免它的正确方法是什么?

Rog*_*and 1

一些选项:


如果(且仅当)您运行的是 Windows 7/8 64 位(而非 32 位)或 Windows Server 2008 R2 或更高版本,您可以完全绕过系统调度程序并自行处理此问题,尽管它不是一个微不足道的事业!

MSDN 上对此有描述描述,称为用户模式调度 (UMS)

下面来自 MSDN 的部分屏幕截图 - 这对您有用吗?

在此输入图像描述

此外,在 BIOS 中禁用超线程(如果适用)可能是一个好主意,因为对于 Windows 如何区分逻辑核心和物理核心存在一些争论。请参阅此处进行讨论

还有一些可用的功能,例如SetThreadAffinityMask()此处为 MSDN),SetThreadIdealProcessor()它们可能会有所帮助,尽管我个人发现这有点偶然。更常见的情况是,我损害了整体吞吐量,而不是帮助它。