A.25 Примеры предложения атрибута данных copyprivate
**Пример 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);
}
Если подпрограмма init вызывает метод с серийной области, его функциональности не влияет на присутствием директив. После вызова get_values подпрограмма не будет выполнена одним потоком, поток оставляет конструкция до закрытых объектов, обозначенных by a" в" 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;
}