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

10

我正在开发一个数据排序程序,需要将该程序的优先级设置为31,我相信这是Windows中最高的进程优先级。我进行了一些研究,但无法找到如何在C ++中实现它的方法。


在Unix中,你可以使用unistd.h中的nice(int inc)函数,那么在Windows上有类似的东西吗? - jcomeau_ictx
1
仅出于好奇,为什么对数据进行排序的程序需要以最高优先级运行? - Jeremy Friesner
7
未来的谷歌搜索者:设置非常高的优先级不会显著提高此类程序的吞吐量,因为即使在空闲优先级下,它可能仍使用99%的CPU。 高优先级对于减少延迟更为有用。 - Navin
3
只有当 CPU 的使用存在争用时,设置程序的优先级才会有所影响。因此,请不要将游戏程序设置为最高优先级。这样做可能会导致与系统依赖项的“优先级倾斜”(priority skew)问题。 - dyasta
3个回答

18

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

SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS)

注意: 如果你要请求真正的实时优先级,那么你将会得到它。这是一种毁灭性的力量。操作系统会无情地将实时优先级线程置于其他高优先级任务,比如操作系统级别的输入处理、磁盘缓存刷新等等之上。如果你的实时线程耗尽了CPU容量,你很容易让整个系统死机。在进行此操作时请谨慎,除非绝对必要,否则请考虑使用高优先级。 更多信息


5
以下函数可以完成此工作:
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 就足够了。 - IInspectable
GetCurrentProcess() 函数出了什么问题?我相信 OP 想要提高自己程序的优先级,而不是别人的。 - Seva Alekseyev
@SevaAlekseyev - 已修复。谢谢。 - Michael Haephrati

1

在调用 SetPriorityClass 之前(或之后),您必须设置各个线程的优先级以达到最大可能性。此外,对于实时优先级类别,还需要另一个安全令牌,所以请确保获取它(如果可访问)。SetThreadPriority 是 SetPriorityClass 后备的API。


1
需要哪种安全令牌,我该如何获取? - mojo
抱歉,从这里开始你就得自己解决了。这很简单。你肯定已经想出来了,或者已经继续前进了。 - dyasta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接