c++ - 即使我设置了 THREAD_MODE_BACKGROUND_BEGIN,为什么我的程序仍然是一个资源 pig ?

原文 标签 c++ windows openmp

我有一个结构如下的程序,它是一个巨大的 CPU pig 。整个系统的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 object .使用 JOBOBJECT_CPU_RATE_CONTROL_INFORMATION 用于细粒度控制您的应用程序可以消耗多少 CPU。作业与线程关联的最重要的好处是作业限制适用于整个进程和受控进程产生的任何进程。

关于c++ - 即使我设置了 THREAD_MODE_BACKGROUND_BEGIN,为什么我的程序仍然是一个资源 pig ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36309236/

相关文章:

windows - 如何使用 Access/VBA 复制到剪贴板?

c - 为什么此代码的并行执行比顺序执行慢?

c++ - 使用openmp进行LU分解

c++ - 在 gmock 的 EXPECT_CALL 中调用 sleep()

c++ - dev-cpp 和 Microsoft Visual C++ math.h 的区别

c++ - OpenGL中的mipmap颜色伪像

c - 如何更改按钮上的光标?

windows - 获取流程总页面错误

c++ - 从包装类公开内部类的公共(public)枚举

gcc - OpenMP 是否支持工作窃取机制?