C++ OpenMP部分的中断&;任务
我希望能够运行两个永远运行的线程(一个线程计算一些复杂的计算,另一个线程计算时间并产生超时)。一旦超时线程达到要求的时间,我想停止这两个线程。我尝试了几种方法:首先将第一个线程作为任务运行并退出线程,然后使用节(尝试运行#pragma omp cancel节)。 这就是我到目前为止所做的: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 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是对的。我有第二个部分的原因是在另一个部分运行时异步计数。如果我在另一个线程中检查超时,它将不准确:函数可能在超时之前运行,但在超时之后完成,因为检查是在函数之前完成的。