OpenMP并行现在等待
OpenMP parallel nowait
OpenMP有办法移除parallel
块上的屏障吗?
我知道nowait
可以在parallel
内的for
或sections
块中使用,以便允许线程继续前进,而不必等待所有线程完成相关块。但是,#pragma omp parallel nowait
会生成编译器错误。
我正在开发一个带有用户界面的程序。我调用一个函数来加载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
是被禁止的,我的理解是,如果由于parallel
末尾的隐式屏障而出现连接问题(中止所需时间比加载UI所需时间更长),程序仍然会暂时挂起。
有办法绕过这个吗?我真正想做的是请求一个新线程在程序进行时进行连接,而不管线程做什么或需要多长时间才能完成(显然,线程不会接触主线程使用的任何数据)。
我认为您尝试做的与OpenMP fork-join模型不兼容。其想法是,在每个平行区域中,您生成在平行区域末端连接的线程。好吧,线程实际上并不是派生的,因为通常有一个线程池,但这是概念模型。
请注意,即使是以下情况也会产生编译器错误:
#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。
- 在等待时破坏condition_variable
- 工作线程一直在等待,condition_variable甚至调用了notify_all
- std::lock_guard 在 OpenMP 并行中
- 为什么condition_variable在等待生产者-消费者的锁定?C++
- 仅在等待 20 秒后更新数据库记录,以便可以接收最大记录
- Java本机接口-C 不在等待Java功能完成
- 如果其他人在等待,是否有标准的STL或QT方法可以产生互惠码,否则请保留它
- QSslSocket 在等待数据时超时(但 QTcpSocket 不会)
- 避免在 openmp 并行块中使用预编译器语句出现未使用的变量警告
- 我如何在源代码中找到仍在等待的被破坏线程
- 如何停止C 程序在等待条件时关闭时崩溃
- 如果condition_variable::wait_for-delay参数在等待过程中发生更改,该怎么办
- 如何在等待时取消"提升::ASIO::读取"操作
- BlockingQueue 的 QWaitCondition:在线程仍在等待时销毁
- MySQL Windows c api 命名管道错误:"在'等待初始通信数据包'时丢失与 MySQL 服务器的连接,系统错误:0
- 在等待输入时执行无限循环
- QWaitCondition:在线程仍在等待时已销毁
- C++/QT/OpenMP:访问同一实例时,线程似乎在等待
- 线程池卡在等待状态
- condition_variable::wait_for 总是在等待