在单核多线程程序中,经常需要同步多个线程以完成任务,在这个过程中有的线程会被挂起。在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之后的代码才会被执行。
本文介绍了在OpenMP编程中如何使用barrier同步多线程。通过示例代码展示了未使用barrier和使用barrier时的不同运行结果,说明了barrier在确保所有线程执行完相同阶段的代码后再继续执行后续任务的重要性。
368

被折叠的 条评论
为什么被折叠?



