问题描述:在用openmp并行化处理for循环的时候,便无法在for循环中用break语句,那么我们如何实现这样的机制呢?在stackoverflow上看到一个不错的回答总结一下。
volatile bool flag = false;
#pragma omp parallel for shared(flag)
for(int i = 0;i < 100000;i++)
{
if(flag) continue;
if(element[i]...)
{
...
flag=true;
}
}
其中volatile关键字的作用是使得flag变量的改变在所有进程中同步,即保证只要有一个线程将flag改为true,那么从flag值改变的这一刻起所有其他线程的flag值都将变为true,那么所有的线程就不会对element[i]继续进行判断,相当于饶了一个弯实在并行的for中实现了break。
stackoverflow上针对这个答案还有一个改进版的答案也值得学习一下:
volatile bool flag = false;
for(int i = 0;i < 100&&!flag;i++) {
int base = i*1000;
#pragma omp parallel for shared(flag)
for(int j = base;j |