A.19 显示工作共享指令的不正确嵌套的示例

本节中的示例演示嵌套规则的指令。 有关指令嵌套的更多信息,请参见在第 33 页的 第2.9部分

,由于内部和外部 for 指令嵌套并绑定到同一个 parallel 指令,下面的示例是不符合:

void wrong1(int n)
{
  #pragma omp parallel default(shared)
  {
      int i, j;
      #pragma omp for
      for (i=0; i<n; i++) {
          #pragma omp for
              for (j=0; j<n; j++)
                 work(i, j);
     }
   }
}

前面示例的以下动态嵌套的版本也是不符合:

void wrong2(int n)
{
  #pragma omp parallel default(shared)
  {
    int i;
    #pragma omp for
      for (i=0; i<n; i++)
        work1(i, n);
  }
}

void work1(int i, int n)
{
  int j;
  #pragma omp for
    for (j=0; j<n; j++)
      work2(i, j);
}

下面的示例是不符合标准的,因为 for 和 single 指令嵌套,并且,它们绑定到同一个并行区域:

void wrong3(int n)
{
  #pragma omp parallel default(shared)
  {
    int i;
    #pragma omp for
      for (i=0; i<n; i++) {
        #pragma omp single
          work(i);
      }
  }
}

,因为在 for 内的某个 barrier 指令会导致死锁,下面的示例是不符合:

void wrong4(int n)
{
  #pragma omp parallel default(shared)
  {
    int i;
    #pragma omp for
      for (i=0; i<n; i++) {
        work1(i);
        #pragma omp barrier
        work2(i);
      }
  }
}

下面的示例是不符合标准的,因为 barrier 导致死锁这是因为只有一个线程每次只能输入临界区:

void wrong5()
{
  #pragma omp parallel
  {
    #pragma omp critical
    {
       work1();
       #pragma omp barrier
       work2();
    }
  }
}

下面的示例是不符合标准的,因为 barrier 导致死锁由于只有一个线程执行 single 部分的这是:

void wrong6()
{
  #pragma omp parallel
  {
    setup();
    #pragma omp single
    {
      work1();
      #pragma omp barrier
      work2();
    }
    finish();
  }
}