c++ - OpenMP 并行等待

标签 c++ multithreading parallel-processing openmp

OpenMP 是否有办法移除parallel block 上的障碍?

我知道 nowait 可以在 parallel 中的 forsections block 中使用,以便允许线程继续前进,而不必等待所有线程完成相关 block 。但是,#pragma omp parallel nowait 会生成编译器错误。

我正在开发一个带有 UI 的程序。我调用了一个函数来加载 UI,在此期间,我还想联系服务器以发送一些使用数据。

这些功能中的每一个都可以正常工作,但如果我不并行执行它们,则需要一段时间。如果服务器宕机,那么连接尝试可能需要几秒钟才能中止,然后简单地加载 UI 也需要一秒钟,这时事情就太长了。先加载 UI 然后再建立连接会使 UI 看起来像卡住了。

所以我想做类似的事情

// this generates a compiler error
#pragma omp parallel num_threads(2) nowait
{
  if(omp_get_thread_num() == 0)
    LoadUI();
  else
    Connect();
}

这样一来,主线程(必须是加载 UI 的线程)将加载 UI,然后继续前进,而不管任何连接问题。但是,由于 parallel nowait 被禁止,据我所知,如果存在连接问题(中止时间比 UI 加载时间长),程序仍会暂时挂起,这是由于隐式障碍parallel 结束。

有解决办法吗?我真正想做的是请求一个新线程在程序继续进行时进行连接,而不管线程做什么或需要多长时间才能完成(显然,线程不会触及主机使用的任何数据线程)。

最佳答案

我认为您尝试做的事情与 OpenMP fork 连接模型不兼容。这个想法是在每个并行区域中生成在并行区域末尾连接的线程。好吧,线程不是实际上产生的,因为通常有一个线程池,但这是概念模型。

请注意,即使是以下内容也会产生编译器错误:

#pragma omp parallel for nowait
for (i=0; i<10; i++) {
  ...
}

您可以做的是避免 for 之后的障碍, 平行区域。例如:

#pragma omp parallel
{
    #pragma omp parallel for
    for (int i=0; i<2; i++) {
    }
    /* no wait here */
    #pragma omp for
    for (int i=0; i<2; i++) {
    }
}

要执行您需要的操作,您可能必须使用 pthreads 或线程库。

PS:您可以使用 OpenMP 部分而不是检查线程 ID。

关于c++ - OpenMP 并行等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37533363/

相关文章:

c++ - 如何使用位移来代替整数除法?

c++ - 在屏幕上的确切位置保存和恢复 Qt 小部件

c++ - 在这里类型转换最好的解决方案吗?

c# - 有没有适合C#开发者的可编程并行编程环境/框架?

c++ - 按值排序的 std::find 和 std::any_of

c++ - 将 C++ 套接字代码移植到 Windows

c++ - boost boost::posix_time::milliseconds 可以将接近 0 的值变成 0 吗?

python - 如何并行或多线程执行代码

c# Thread不会将Row添加到DataGridView CrossThreadError

c - MPI 异步发送和接收未按预期工作