如何在 C++ 中设置进程优先级

Posted

技术标签:

【中文标题】如何在 C++ 中设置进程优先级【英文标题】:How to set the process priority in C++ 【发布时间】:2011-03-07 05:57:22 【问题描述】:

我正在开发一个对数据进行排序的程序,我需要将进程设置为优先级 31,我认为这是 Windows 中最高的进程优先级。我做了一些研究,但不知道如何在 C++ 中进行。

【问题讨论】:

在 Unix 中,你在 unistd.h 中有 nice(int inc),也许在 Windows 上有类似的东西? 只是出于好奇,为什么对数据进行排序的程序需要以最高优先级运行? 对于未来的谷歌用户:设置一个非常高的优先级不会显着提高此类程序的吞吐量,因为即使在空闲优先级上它也可能使用 99% 的 CPU。高优先级对于减少延迟更有用。 确实,只有当 CPU 存在 争用 时,它才重要。因此,请不要将您的游戏设置为最高优先级。我这么说是因为它可能会导致它可能依赖的系统依赖项出现“优先级偏差”。 【参考方案1】:

Windows API 调用SetPriorityClass 允许您更改进程优先级,请参阅 MSDN 文档中的示例,并使用 REALTIME_PRIORITY_CLASS 设置最高优先级:

SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS)

警告:如果您要求真正的实时优先级,您将得到它。这是核弹。操作系统将无情地优先考虑实时优先级线程,甚至远高于操作系统级输入处理、磁盘缓存刷新和其他高优先级时间关键任务。如果您的实时线程耗尽您的 CPU 容量,您可以轻松锁定整个系统。这样做时要小心,除非绝对必要,否则请考虑使用高优先级。 More information

【讨论】:

【参考方案2】:

以下函数将完成这项工作:

void SetProcessPriority(LPWSTR ProcessName, int Priority)

    PROCESSENTRY32 proc32;
    HANDLE hSnap;
    if (hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0));
    if (hSnap == INVALID_HANDLE_VALUE)
    

    
    else
    
        proc32.dwSize = sizeof(PROCESSENTRY32);
        while ((Process32Next(hSnap, &proc32)) == TRUE)
        
            if (_wcsicmp(proc32.szExeFile, ProcessName) == 0)
            
                HANDLE h = OpenProcess(PROCESS_SET_INFORMATION, TRUE, proc32.th32ProcessID);
                SetPriorityClass(h, Priority);
                CloseHandle(h);
            
        
        CloseHandle(hSnap);
    

例如,要将当前进程的优先级设置为低于正常,请使用:

SetProcessPriority(GetCurrentProcess(), BELOW_NORMAL_PRIORITY_CLASS)

【讨论】:

您为什么要尝试使用PROCESS_ALL_ACCESS 打开进程?当然,SetPriorityClass API 调用只需要PROCESS_SET_INFORMATION GetCurrentProcess() 发生了什么事?我相信 OP 想要提高自己程序的优先级,而不是其他人的。 @SevaAlekseyev - 已修复。谢谢【参考方案3】:

在 SetPriorityClass 之后(或之前),您必须设置各个线程的优先级以达到可能的最大值。此外,实时优先级需要另一个安全令牌,因此请务必抓住它(如果可以访问)。 SetThreadPriority 是 SetPriorityClass 之后的二级 API。

【讨论】:

需要什么安全令牌,如何获取? 对不起,你自己从这里开始。这很容易。到现在你肯定已经想通了,或者继续前进。

以上是关于如何在 C++ 中设置进程优先级的主要内容,如果未能解决你的问题,请参考以下文章

如何在c#中设置另一个应用程序的优先级

如何通过函数在 C++ 中设置私有静态数组?

如何在jquery或javascript中设置函数调用的顺序或优先级?

如何在 C++ 中设置浮点变量的精度

如何在 C++ 中设置浮点数的精度 [重复]

如何在 Visual Studio (C++) 中设置发布分析