Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenMP部分的中断&;任务_C++_Multithreading_Openmp - Fatal编程技术网

C++ OpenMP部分的中断&;任务

C++ OpenMP部分的中断&;任务,c++,multithreading,openmp,C++,Multithreading,Openmp,我希望能够运行两个永远运行的线程(一个线程计算一些复杂的计算,另一个线程计算时间并产生超时)。一旦超时线程达到要求的时间,我想停止这两个线程。我尝试了几种方法:首先将第一个线程作为任务运行并退出线程,然后使用节(尝试运行#pragma omp cancel节)。 这就是我到目前为止所做的: #pragma omp parallel num_threads(8) shared(break_out) { while (!break_out){

我希望能够运行两个永远运行的线程(一个线程计算一些复杂的计算,另一个线程计算时间并产生超时)。一旦超时线程达到要求的时间,我想停止这两个线程。我尝试了几种方法:首先将第一个线程作为任务运行并退出线程,然后使用节(尝试运行#pragma omp cancel节)。 这就是我到目前为止所做的:

    #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**
#pragma omp并行线程数(8)共享(中断)
{
而(!突然爆发){
#pragma omp部分
{
#pragma-omp段
复合_计算();
#pragma-omp段
{
//计时
while(true){
当前时钟=标准::时钟::高分辨率时钟::现在();
墙时钟=标准:时钟:持续时间(当前时间-开始时间);
如果(wall_clock.count()>0.99*时间限制){
中断=正确;
#pragma omp取消部分
打破
}
}
}
}
}
}
**点X**

当超时发生时,代码能够跳出第二部分,但第一部分仍在运行。有没有办法返回程序中的“X点”?

第二个
节中的
取消
构造将正确终止第二个
构造。但它不会影响第一个,除非您在第一个
部分中添加
取消点
构造


OpenMP总是需要结合使用
cancel
构造来触发OpenMP区域的取消,以及其他线程/任务中的
cancellation point
构造来做出反应并取消它们的区域。

OpenMP并不是这种手动线程管理的正确范例。您将绕过OpenMP独自完成大量的线程管理/通信。另请参阅“思考同样多”:我将在您发送的链接中尝试您的建议。问题是,一旦您必须手动插入取消点,使用看门狗线程和取消比仅在计算线程中检查时间几乎没有好处。是的,@Zulan是对的。我有第二个部分的原因是在另一个部分运行时异步计数。如果我在另一个线程中检查超时,它将不准确:函数可能在超时之前运行,但在超时之后完成,因为检查是在函数之前完成的。