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)
我经常观察到不公平的线程调度,例如:

这是不公平的每次运行,但是当它是,它在整个应用程序生命周期保持不公平的.
为什么会发生这种情况,以及避免它的正确方法是什么?
一些选项:
如果(且仅当)您运行的是 Windows 7/8 64 位(而非 32 位)或 Windows Server 2008 R2 或更高版本,您可以完全绕过系统调度程序并自行处理此问题,尽管它不是一个微不足道的事业!
MSDN 上对此有描述描述,称为用户模式调度 (UMS)。
下面来自 MSDN 的部分屏幕截图 - 这对您有用吗?

此外,在 BIOS 中禁用超线程(如果适用)可能是一个好主意,因为对于 Windows 如何区分逻辑核心和物理核心存在一些争论。请参阅此处进行讨论。
还有一些可用的功能,例如SetThreadAffinityMask()(此处为 MSDN),SetThreadIdealProcessor()它们可能会有所帮助,尽管我个人发现这有点偶然。更常见的情况是,我损害了整体吞吐量,而不是帮助它。
| 归档时间: |
|
| 查看次数: |
1239 次 |
| 最近记录: |