2.7.1 threadprivate dyrektywy
threadprivate Dyrektywa sprawia, że nazwany zakres pliku, zakres obszaru nazw lub zakresu statycznego blok zmiennych określonych w listy zmiennej prywatnych do wątku.Lista zmiennych jest rozdzielaną przecinkami listę zmiennych, które nie mają niekompletnemu typowi.Składnia threadprivate dyrektywy jest następująca:
#pragma omp threadprivate(variable-list) new-line
Każda kopia threadprivate zmienna jest raz zainicjowana punkcie nieokreślonych w programie przed pierwszym odniesienie do tej kopii i w zwykły sposób (czyli jako wzorcową kopię będzie zainicjowany szeregowego na wykonanie programu).Należy zauważyć, że jeśli obiekt jest wywoływany w jawny inicjatora, z threadprivate zmienna i wartość obiektu modyfikowane są przed pierwszym odniesienie do kopii zmiennej, a następnie zachowanie jest nieokreślony.
Jako z dowolnej zmiennej prywatnej, wątek nie musi referencyjne kopię inny wątek threadprivate obiektu.Podczas szeregowego regionów i regionów wzorca programu odwołania będzie wątek główny kopii obiektu.
Po wykonaniu pierwszego regionu równolegle, dane w threadprivate obiektów jest gwarantowane, utrwalania, tylko jeśli dynamiczny wątki mechanizm zostało wyłączone, a jeśli liczba wątków pozostaje niezmieniony we wszystkich regionach równolegle.
Ograniczenia w odniesieniu do threadprivate dyrektywy są w następujący sposób:
A threadprivate dyrektywy dla pliku zakres lub zakres nazw zmiennych muszą znajdować się poza żadnych definicji lub deklaracji i leksykalnych musi poprzedzać wszystkie odwołania do wszelkich zmiennych w swojej listy.
Każda zmienna w listy zmiennej z threadprivate dyrektywy w zakresie pliku lub obszaru nazw muszą odwoływać się do deklaracji zmiennej w pliku lub obszaru nazw, zakres, który poprzedza leksykalnych niniejszej dyrektywy.
A threadprivate dyrektywy dla zakresu statycznego blok zmiennych muszą znajdować się w zasięgu zmiennej, a nie w zakres zagnieżdżone.Dyrektywy leksykalnych musi poprzedzać wszystkie odwołania do wszelkich zmiennych w swojej listy.
Każda zmienna w listy zmiennej z threadprivate dyrektywy w zakresie blok musi odwoływać się do deklaracji zmiennej w ten sam zakres, który poprzedza leksykalnych niniejszej dyrektywy.Deklaracja zmiennej, należy użyć specyfikatora statyczne klasy magazynowania.
Jeśli zmienna jest określona w threadprivate dyrektywy w jedno tłumaczenie jednostki, musi zostać określona w threadprivate w każdej jednostki tłumaczenia, w którym jest on zadeklarowany w dyrektywie.
A threadprivate zmienna nie umieszcza się w klauzuli, z wyjątkiem copyin, copyprivate, schedule, num_threads, lub Jeśli klauzuli.
Adres threadprivate zmienna nie jest stałą adres.
A threadprivate zmienna nie może mieć niekompletnemu typowi lub typ odwołania.
A threadprivate zmienna typu klasy innych niż POD musi mieć konstruktora dostępne, jednoznaczne kopia, jeśli jest on zadeklarowany jako z inicjatora jawne.
Poniższy przykład ilustruje, jak modyfikacja zmiennej, która pojawia się w inicjatorze może być przyczyną zachowanie nieokreślone i również sposób uniknąć tego problemu przy użyciu obiektu pomocniczego i konstruktorem kopii.
int x = 1;
T a(x);
const T b_aux(x); /* Capture value of x = 1 */
T b(b_aux);
#pragma omp threadprivate(a, b)
void f(int n) {
x++;
#pragma omp parallel for
/* In each thread:
* Object a is constructed from x (with value 1 or 2?)
* Object b is copy-constructed from b_aux
*/
for (int i=0; i<n; i++) {
g(a, b); /* Value of a is unspecified. */
}
}
Odsyłacze:
Wątki dynamicznych, zobacz ppkt 3.1.7 na stronie 39.
OMP_DYNAMICpatrz zmienna środowiska sekcji 4.3 na stronie 49.