OpenMP* CRITICAL 宣言子の不適切な入れ子

同じ名前の CRITICAL 宣言子の動的な入れ子は許可されていません。

CRITICAL 宣言子は、指定された名前でクリティカル領域を構築します。これにより、その領域で一度に実行できるスレッドは 1 つのみになります。ネイティブ・スレッド化ライブラリーのクリティカル・セクションとは異なり、OpenMP* のクリティカル・セクションは リエントラントではありません。つまり、同じ物理スレッドがクリティカル・セクションから出ることなく、2 回入ろうとすると、自身によってデッドロックになります。

ID

問題箇所

説明

1

OpenMP* の使用方法に関するエラー

2 番目に (不正に) 実行された CRITICAL 宣言子の場所

2

定義

最初に (正規に) 実行された CRITICAL 宣言子の場所

          
#include <stdio.h>

void mysub(int ii, int * jj) {
    // bad nesting here
    #pragma omp critical (sum)
    *jj += ii;
}
 
int main(int argc, char **argv)
{
    int i, j;
 
    #pragma omp parallel for private(j) ordered
    for (i = 1; i < 10; i++) {
        j = 0;
        
        #pragma omp critical (not_sum)
        mysub(i, &j);
        
        #pragma omp critical (sum)
        mysub(i, &j);
        
        #pragma omp ordered
        printf("%d\n", j);
    }
    return 0;
}
        

© 2010 Intel Corporation. 無断での引用、転載を禁じます。