次の方法で共有


A.25 copyprivate データ属性句の例

例 1: copyprivate 句 (32 ページのセクション 2.7.2.8) を使用して、シングル スレッドによって取得された値を他のスレッドのプライベート変数のすべてのインスタンスに直接ブロードキャストできます。

float x, y;
#pragma omp threadprivate(x, y)

void init( ) 
{
    float a;
    float b;

    #pragma omp single copyprivate(a,b,x,y)
    {
        get_values(a,b,x,y);
    }

    use_values(a, b, x, y);
}

シリアル領域からルーチン init が呼び出された場合、その動作は、このディレクティブの存在に影響されません。1 つのスレッドが get_values ルーチンを呼び出した後、すべてのスレッドで abx、および y で指定されているプライベート オブジェクトが、読み込まれた値で定義されるまで、どのスレッドもコンストラクトから出ません。

例 2: 前の例とは対照的に、特定のスレッド、つまりマスタ スレッドによって読み込みが実行されなければならない場合を示します。この場合、copyprivate 句を使用して直接ブロードキャストを実行することはできませんが、一時的に共有されるオブジェクトにアクセスできます。

float read_next( ) 
{
    float * tmp;
    float return_val;

    #pragma omp single copyprivate(tmp)
    {
        tmp = (float *) malloc(sizeof(float));
    }

    #pragma omp master
    {
        get_float( tmp );
    }

    #pragma omp barrier
    return_val = *tmp;
    #pragma omp barrier

    #pragma omp single
    {
       free(tmp);
    }

    return return_val;
}

例 3: 並行領域内部で必要になるロック オブジェクト数が、並行領域に入るまで簡単にはわからない場合を示します。copyprivate 句を使用して、並行領域内で割り当てられる共有ロック オブジェクトにアクセスできます。

#include <omp.h>

omp_lock_t *new_lock()
{
    omp_lock_t *lock_ptr;

    #pragma omp single copyprivate(lock_ptr)
    {
        lock_ptr = (omp_lock_t *) malloc(sizeof(omp_lock_t));
        omp_init_lock( lock_ptr );
    }

    return lock_ptr;
}