6

下面的 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;
  }
}

我获得了以下输出(对于交织来自 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

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

4

1 回答 1

4

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

共享条款

确保多个线程正确访问 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;
      }
于 2013-04-30T18:22:32.450 回答