我已获得以下代码:
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循环。目前还不知道之前会执行多少循环,但保证所有线程都具有相同的迭代次数。
答案 0 :(得分:1)
尽管您尝试与屏障同步,但A]]]]
上的竞争条件确实很容易导致迭代次数不等:
working_threads
要修复特定代码,您还必须在while-condition-check和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]
之间添加障碍。
working_threads = 0
请注意,代码并不是最惯用或最优雅的解决方案。根据您的具体工作共享问题,可能有更好的方法。此外,您必须确保#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
}
}
仅由单个线程编写 - 或在编写时使用原子。