为什么即使我设置了THREAD_MODE_BACKGROUND_BEGIN,我的程序仍然占用资源

Why is my program a resource hog even though I set THREAD_MODE_BACKGROUND_BEGIN?

本文关键字:程序 我的 资源 BEGIN BACKGROUND 设置 MODE THREAD 为什么      更新时间:2023-10-16

我有一个如下结构的程序,它占用了大量的CPU。整个系统的IO速度变慢了,我几乎无法移动鼠标指针。。。

为什么?我认为THREAD_MODE_BACKGROUND_BEGIN应该防止这种情况发生?

#pragma omp parallel 
{
    SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_BEGIN);
    #pragma omp for 
    for (...)
    {
        doTruckLoadsOfComputation();
        if (omp_get_thread_num()==0)
            doTinyAmountOfIO(); //progress indicator
    }
    SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_END);
}

更新:

添加SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_BELOW_NORMAL);解决了占用CPU的问题,但问题仍然存在,为什么仅后台模式还不够?

这对于注释来说太长了

您有更简单的替代方案:START /BELOWNORMAL <yourexe>可以以较低的优先级运行任何任意进程,无需修改源代码。

如果你想在应用程序中完成,一个更好的选择是给我们一个Job对象。使用JOBOBJECT_CPU_RATE_CONTROL_INFORMATION对应用程序可以消耗的CPU数量进行细粒度控制。job与线程亲和性相比,最重要的好处是作业限制适用于整个进程适用于受控进程派生的任何进程。