【发布时间】:2019-04-02 19:45:51
【问题描述】:
我希望能够运行两个永远运行的线程(一个线程计算一些复杂的计算,另一个线程计算时间并产生超时)。一旦超时线程达到所需时间,我想停止两个线程。我尝试了几种方法:首先将第一个线程作为任务运行并退出线程,然后使用节(通过尝试运行 #pragma omp cancel sections)。 这是我目前所拥有的:
#pragma omp parallel num_threads(8) shared(break_out)
{
while (!break_out){
#pragma omp sections
{
#pragma omp section
complex_calc();
#pragma omp section
{
//Timekeeping
while(true){
current_time = std::chrono::high_resolution_clock::now();
wall_clock = std::chrono::duration_cast<std::chrono::duration<double>> (current_time - start_time);
if (wall_clock.count() > 0.99 * TIME_LIMIT){
break_out = true;
#pragma omp cancel sections
break;
}
}
}
}
}
}
**Point X**
当超时发生时,代码能够跳出第二部分,但第一部分仍然运行。有没有办法在程序中返回到'Point X'?
【问题讨论】:
-
OpenMP 并不是真正适合这种手动线程管理的范例。您最终将绕过 OpenMP 自行执行大量线程管理/通信。另见stackoverflow.com/q/43496870/620382
-
想了很多:/我会在您发送的链接中尝试您的建议。
标签: c++ multithreading openmp