共用方式為


A.19 範例會顯示不正確的巢狀結構的工作共用的指示詞

本章節範例說明了這些指示詞的巢狀規則。 如需有關指示詞的巢狀結構的詳細資訊,請參閱一節 2.9 在頁面上 33。

下列範例是不相容因為內部和外部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);
      }
  }
}

下列範例是不相容因為barrier指示詞內for可能會導致死結:

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();
  }
}