加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

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

发布时间:2020-12-14 02:22:47 所属栏目:Windows 来源:网络整理
导读:有时候,当我运行这个简单的程序时 #include Windows.hDWORD WINAPI ThreadStart(LPVOID){ for (;;) { } return 0;}int _tmain(){ SetPriorityClass(GetCurrentProcess(),BELOW_NORMAL_PRIORITY_CLASS); SYSTEM_INFO si; GetSystemInfo(si); for (DWORD i = s
有时候,当我运行这个简单的程序时

#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,&ThreadStart,NULL,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()可能会有所帮助,虽然我个人认为这有点昙花一现.我经常会损害整体吞吐量而不是帮助它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读