c - Windows线程调度器不公平?

标签 c windows winapi cpu 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);
}

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

Screenshot

并非每次运行都不公平,但是当它时,它会在应用程序的整个生命周期中保持不公平。

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

最佳答案

一些选项:


如果(且仅当)您运行的是 Windows 7/8 64 位(非 32 位)或 Windows Server 2008 R2 或更高版本,您可以完全绕过系统调度程序并且自己处理这件事,虽然这不是一件小事!

described on MSDN here称为用户模式调度 (UMS)

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

enter image description here

此外,在您的 BIOS 中禁用超线程(如果适用)可能是个好主意,因为对于 Windows 如何区分逻辑内核和物理内核存在一些争论。 See here for a discussion .

还有一些函数可用,例如 SetThreadAffinityMask() ( MSDN here ) 和 SetThreadIdealProcessor() 这可能会有所帮助,尽管我个人认为这是一个有点碰运气。更常见的情况是我损害了整体吞吐量而不是帮助它。

关于c - Windows线程调度器不公平?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16453951/

相关文章:

c - 何时将 malloc 用于函数内的静态指针?

C 指针与二维数组

mysql - 如果我为每个线程初始化一个 mysql 连接,mysql_query 是线程安全的吗?

windows - Windows .bat 文件中命令的设置超时

windows - 自动在三个命令提示符下运行命令?

c++ - 使用 SetupAPI 找出事件的图形驱动程序

c - 如何在 Makefile 中实现 "make install"?

我认为 Ruby UTF-16 编码

c++ - 可移植可执行文件是否可以在代码段中直接绝对引用外部库,而不是通过 IAT?

c - 如何检查 Windows 文件索引是打开还是关闭