OpenMP的同步结构(Synchronization Constructs)指令包master、critical、barrier、atomic、flush、ordered等
1. master指令
- master指令指定的区域只由主线程执行,团队中其他线程都跳过该区域代码
- 本指令没有隐含的barrier,即其他线程不用再master区域结束处同步,可立即执行后续代码。
代码示例如下
#pragma omp parallel
{
#pragma omp master
{
printf("in master thread %d\n", omp_get_thread_num());
}
printf("out master thread %d\n", omp_get_thread_num());
}
运行结果如下,可见只有主线程0执行了master区域代码。
2. critical指令
- critical指令指定的代码区域,一次只能由一个线程执行。
- 如果一个线程当前正在一个critical区域内执行,而另一个线程到达该区域并试图执行它,它将阻塞,直到第一个线程退出该区域。
其语法格式如下
#pragma omp critical [ name ] newline
structured_block
其中有一个可选名称选项,该选项允许存在多个不同的critical区域,其特性如下:
- 该名称充当critical区域全局标识符,相同名称的不同临界区域被视为同一区域。
- 所有未命名的critical区域均视为同一区域。
critical用法很简单,下面演示下命名critical的特性
2. 1 不同名称的多个critical区域
代码示例如下:
#pragma omp parallel sections
{
#pragma omp section
{
#pragma omp critical (critical1)
{
for (int i=0; i < 5; i++)
{
printf