Sdílet prostřednictvím


2.7.1 threadprivate – direktiva

threadprivate Směrnice umožňuje pojmenovaný soubor oboru, obor názvů nebo statického oboru blok proměnných v seznamu proměnné soukromý podproces.Proměnná seznamu je čárkami oddělený seznam proměnných, které nemají neúplné typu.Syntaxe threadprivate směrnice je následující:

#pragma omp threadprivate(variable-list) new-line

Každá kopie threadprivate inicializuje proměnná jednou, nespecifikované bodu v programu před první odkaz na tuto kopii a obvyklým způsobem (tj, jako hlavní kopie by inicializována v sériové spuštění programu).Všimněte si, že objekt odkazuje explicitní inicializátoru z threadprivate proměnné a hodnotu objektu, je změněna před na první odkaz na proměnnou kopii a potom chování není určena.

Jako všechny soukromé proměnné musí odkazovat podproces není jiný podproces kopii threadprivate objektu.Během sériové regionů a oblastí hlavního programu budou odkazy hlavní podproces kopii objektu.

Po první oblast paralelní zpracuje data v threadprivate objektů je zaručeno zachování, pouze pokud dynamický podprocesy mechanismus byl zakázán a pokud zůstane beze změny pro všechny oblasti paralelní počet podprocesů.

Omezení týkající threadprivate směrnice jsou následující:

  • A threadprivate směrnice pro obor souboru nebo oboru názvů proměnných musí být mimo žádná definice nebo prohlášení a musí předcházet lexically všechny odkazy na libovolné proměnné v jeho seznamu.

  • Každá proměnná v seznamu proměnné z threadprivate směrnice v souboru nebo oboru názvů oboru musí odkazovat na deklaraci proměnné v rozsahu souboru nebo oboru názvů, který předchází lexically směrnice.

  • A threadprivate směrnice pro statické blok rozsah proměnné musí být v rozsahu proměnné a nikoli v vnořené oboru.Směrnice lexically musí předcházet všechny odkazy na libovolné proměnné v jeho seznamu.

  • Každá proměnná v seznamu proměnné z threadprivate směrnice v oboru bloku musí odkazovat na deklaraci proměnné ve stejném oboru, který předchází lexically směrnice.Specifikátor statické třídy úložiště, musíte použít deklaraci proměnné.

  • Jestliže proměnná se v threadprivate v jednotce jeden překlad směrnice, musí být zadáno v threadprivate směrnice každý překlad jednotky, v němž je deklarován.

  • A threadprivate proměnné se nesmějí objevit klauzulí kromě copyin, copyprivate, schedule, num_threads, nebo -li klauzule.

  • Adresa threadprivate proměnná není adresa konstantu.

  • A threadprivate proměnné nesmí mít neúplný typ nebo odkaz.

  • A threadprivate proměnné typu třídy než LUSKU musí mít konstruktor kopie přístupné, jednoznačné, pokud je deklarována s explicitní inicializátor.

Následující příklad ukazuje, jak změny proměnné, který se zobrazí v inicializátor může způsobit nespecifikované chování a také jak se vyhnout tomuto problému pomocí pomocného objektu a Kopírovat konstruktor.

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. */
   }
}

Křížové odkazy:

  • Dynamické podprocesů, viz části 3.1.7 na straně 39.

  • OMP_DYNAMICprostředí, proměnné, viz oddíl 4.3 na stránce 49.