我希望能够运行两个永远运行的线程(一个线程计算一些复杂的计算,另一个线程计算时间并产生超时)。一旦超时线程达到要求的时间,我想停止两个线程。我尝试了两种方法:首先通过将第一个线程作为任务运行并退出线程,然后通过使用段(尝试运行 #pragma omp cancel section )。 这是我到目前为止的内容:
#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**
当发生超时时,代码可以跳出第二部分,但第一部分仍然运行。有什么方法可以返回程序中的“ X点”?
答案 0 :(得分:1)
第二个cancel
构造中的sections
构造将正确终止第二个sections
构造。除非您在第一个cancellation point
构造中也添加了一个sections
构造,否则它不会影响第一个。
OpenMP始终需要结合使用cancel
构造来触发OpenMP区域的取消和其他线程/任务中的cancellation point
构造来进行反应并取消其区域。