Udostępnij za pośrednictwem


Przykłady danych atrybutu klauzuli copyprivate A.25

**Przykład 1:**copyprivate klauzuli (w sekcji 2.7.2.8 na stronie 32) może służyć do nadawania wartości nabyte przez pojedynczy wątek bezpośrednio do wszystkich wystąpień prywatnych zmiennych w innych wątków.

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

Jeśli rutynowych init jest wywoływana z regionu szeregowego, jego zachowanie nie występuje w obecności dyrektyw.Po wywołaniu get_values rutynowych został wykonany przez jednego wątku, wątek nie pozostawia konstrukcji aż do prywatnych obiektów wyznaczone przez , b, x, i y we wszystkich wątkach zdefiniowane stają się wartościami odczytu.

Przykład 2: w przeciwieństwie do poprzedniego przykładu, załóżmy, że odczytu muszą być przeprowadzane przez określony wątek, powiedz wątek główny.W tym przypadku copyprivate nie można użyć klauzuli bezpośrednio do emisji, ale może służyć do zapewnienia dostępu do tymczasowego obiektu współużytkowanego.

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

Przykład 3: Załóżmy, że liczba obiektów lock wymagane w ramach równoległego regionu nie można łatwo ustalić przed ich wejściem go.copyprivate Klauzula może służyć do zapewnienia dostępu do obiektów udostępnionych blokady, które są przydzielane w tym regionie równolegle.

#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;
}