在单核多线程程序中,经常需要同步多个线程以完成任务,在这个过程中有的线程会被挂起。在OpenMP中,为了同步各个线程,需要使用barrier。
测试代码:
void testBarrier()
{
omp_set_num_threads( 4 );
#pragma omp parallel
{
printf("test OpenMP 1/n");
#pragma omp barrier
printf("test OpenMP 2/n");
}
}
运行结果为:
test OpenMP 1
test OpenMP 1
test OpenMP 1
test OpenMP 1
test OpenMP 2
test OpenMP 2
test OpenMP 2
test OpenMP 2
如果没有使用barrier,
void testBarrier()
{
omp_set_num_threads( 4 );
#pragma omp parallel
{
printf("test OpenMP 1/n");
//#pragma omp barrier
printf("test OpenMP 2/n");
}
}
运行结果为:
test OpenMP 1
test OpenMP 2
test OpenMP 1
test OpenMP 2
test OpenMP 1
test OpenMP 2
test OpenMP 1
test OpenMP 2
所以,当使用了barrier后,只用所有的thread执行了barrier所在处之前的最近的parrallel region代码后,
barrier之后的代码才会被执行。