当终止条件依赖于来自不同部分的更新时,为什么OMP并行部分中的while循环无法终止

wja*_*tle 6 c++ for-loop openmp while-loop

C++代码是否合法,或者我的编译器有问题吗?代码被编译到一个共享库中使用

gcc版本4.4.6 20110731(Red Hat 4.4.6-3)(GCC)

和openMP然后通过R 2.15.2调用.

int it=0;
#pragma omp parallel sections shared(it)
   {
      #pragma omp section
      {
           std::cout<<"Entering section A"<<std::endl;
           for(it=0;it<10;it++)
           {
                   std::cout<<"Iteration "<<it<<std::endl;

           }
           std::cout<<"Leaving section A with it="<<it<<std::endl;
      }

      #pragma omp section
      {
           std::cout<<"Entering section B with it="<<it<<std::endl;
           while(it<10)
           {
                   1;
           }
           std::cout<<"Leaving section B"<<std::endl;
  }
}
Run Code Online (Sandbox Code Playgroud)

我获得了以下输出(对于从2个线程交织输出的道歉,但我认为它是可解释的):

Entering section A
Iteration Entering section B with it=0
0
Iteration 1
Iteration 2
Iteration 3
Iteration 4
Iteration 5
Iteration 6
Iteration 7
Iteration 8
Iteration 9
Leaving section A with it=10
Run Code Online (Sandbox Code Playgroud)

程序然后停止:B部分似乎陷入了while循环.由于变量'it'是共享的,我不明白为什么当A部分完成时,while循环不会终止.

Lol*_*4t0 4

这是因为shared变量仅意味着它对所有线程都相同,但程序员仍然必须手动同步访问

共享条款

程序员有责任确保多个线程正确访问共享变量(例如通过 CRITICAL 部分)

因此,您可以在第一部分完成后刷新变量:

      #pragma omp section
      {
           std::cout<<"Entering section A"<<std::endl;
           for(it=0;it<10;it++)
           {
                   std::cout<<"Iteration "<<it<<std::endl;

           }
           #pragma omp flush(it)
           std::cout<<"Leaving section A with it="<<it<<std::endl;
      }

      #pragma omp section
      {
           std::cout<<"Entering section B with it="<<it<<std::endl;
           while(it<10)
           {
            #pragma omp flush(it)
                   1;
           }
           std::cout<<"Leaving section B"<<std::endl;
      }
Run Code Online (Sandbox Code Playgroud)