c++ - 为什么即使我设置了 THREAD_MODE_BACKGROUND_BEGIN,我的程序还是资源消耗大户?

标签 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,我的程序还是资源消耗大户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36309236/

相关文章:

C++ Win32 未处理的异常处理程序

c++ - 在 C++ 中以这种方式创建字符串数组是否正确?

c++ - 如何获取其他进程的TCP/UDP套接字对的远程端口

multithreading - 使用 OpenMP 的无用 printf 无法加速

c - 如何使用 OpenMP 将每个线程的输出返回到数组中?

c++ - 计算Qt5中写入QDataStream的字节数

c++ - Windows 中的 C++ 是否内置了对 UTF 的支持?

windows - 实现 x86 到 x64 汇编代码切换

c++ - 有没有办法获取在处理信号期间访问的指针?

c++ - 如何在 macOS 上的 Qt 中使用 OpenMP 进行编译?