Udostępnij za pośrednictwem


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.