Multithreading 为什么openMP会在一段时间内挂起屏障?

Multithreading 为什么openMP会在一段时间内挂起屏障?,multithreading,openmp,Multithreading,Openmp,我有以下代码: int working_threads=1; #pragma omp parallel { int my_num=omp_get_thread_num()+1; int idle=false; while(working_threads>0) { if(my_num==1) working_threads=0; #pragma omp barrier

我有以下代码:

    int working_threads=1;
#pragma omp parallel
    {   
        int my_num=omp_get_thread_num()+1;
        int idle=false;
        while(working_threads>0) {
            if(my_num==1)
                working_threads=0;
#pragma omp barrier                                                                                                                       
        }   
    }
如果我运行它,它会不时挂在栅栏上。线程越多,发生这种情况的可能性就越大。我试着用printf调试它,似乎有时候并不是所有的线程都被执行,因此屏障永远在等待它们。这发生在第一次迭代中,第二次迭代显然从未运行过


这是一段无效的代码吗?如果是,我如何更改它?我需要并行运行一个while循环。之前不知道将执行多少个循环,但可以保证所有线程的迭代次数相同。

尽管您尝试与屏障同步,但在工作线程上确实存在竞争条件,这很容易导致不相等的迭代次数:

thread 0                             | thread 1
...                                  | ...
while (working_threads > 0) [==true] | ...
    if (my_num == 1) [==true]        | ...
        working_threads = 0          | ...
                                     | while (working_threads > 0) [==false]
    [hangs waiting for barrier]      | [hangs trying to exit from parallel]
要修复特定代码,还必须在while条件检查和working_threads=0之间添加一个屏障


请注意,代码并不是最惯用或最优雅的解决方案。根据您具体的工作分担问题,可能有更好的方法。此外,您必须确保工作线程仅由单个线程写入,或者在写入时使用原子。

。。。可以保证所有线程都有相同的迭代次数-这是循环的固有属性还是仅通过使用共享变量(如演示的情况)实现的?如果是前者,只需将条件变量设置为私有。后者则通过对共享变量进行测试来完成。这也是比赛条件的原因。谢谢,我不知道如何使它更地道。其思想是每个线程都有一个间隔。然而,一个特定的时间间隔需要多少时间,我们还不知道。因此,每一个区间被划分为多个迭代,并在同一时间内逐个计算。如果有一个空闲线程,它只是从其他人那里获得一部分时间间隔,用于下一次迭代。@knezi,你不能使用任务吗?这些都非常适合像你这样的递归问题。如果你试图实现工作窃取,听起来你可能会有更多的竞争条件。任务可能是一种解决方案,但我对您的潜在问题还不够了解,无法更具体地说。我是openMP新手,不知道任务是如何工作的。我去看看。谢谢你的建议。
#pragma omp parallel
    {   
        int my_num=omp_get_thread_num()+1;
        int idle=false;
        while(working_threads>0) {
#pragma omp barrier      
            if(my_num==1)
                working_threads=0;
#pragma omp barrier                                                                                                                       
        }   
    }