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循环不会终止.
这是因为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)