資料屬性子句 copyprivate 的 A.25 範例
**範例 1:**copyprivate子句 (一節 2.7.2.8 在 32] 頁面上) 可以用來廣播由單一執行緒直接於另一個執行緒的私用變數的所有執行個體所取得的值。
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);
}
如果例行初始化呼叫序列的區域,其行為不會受到指示詞的目前狀態。 若要在呼叫之後 get_values 常式皆執行一個執行緒,沒有執行緒離開之前所指定的私用物件的建構 , b, x,和 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;
}