突破OpenMP部分和任务

时间:2019-04-02 19:45:52

标签: c++ multithreading openmp

我希望能够运行两个永远运行的线程(一个线程计算一些复杂的计算,另一个线程计算时间并产生超时)。一旦超时线程达到要求的时间,我想停止两个线程。我尝试了两种方法:首先通过将第一个线程作为任务运行并退出线程,然后通过使用段(尝试运行 #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点”?

1 个答案:

答案 0 :(得分:1)

第二个cancel构造中的sections构造将正确终止第二个sections构造。除非您在第一个cancellation point构造中也添加了一个sections构造,否则它不会影响第一个。

OpenMP始终需要结合使用cancel构造来触发OpenMP区域的取消和其他线程/任务中的cancellation point构造来进行反应并取消其区域。