Aracılığıyla paylaş


2.7.1 threadprivate yönergesi

threadprivate Yönergesi adlandırılmış dosya kapsamı, ad kapsamı veya belirtilen statik blok kapsam değişkenleri yapar değişken listesi bir iş parçacığı özel.değişken listesi tamamlanmamış bir türü olmayan değişkenleri virgülle ayrılmış bir listesi bulunmaktadır.Sözdizimi threadprivate yönergesinin değeri aşağıdaki gibidir:

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

Her kopyasını bir threadprivate değişken başlatılmış bir kez program için ilk başvuru bu kopyaya öncesinde ve her zamanki şekilde belirtilmeyen bir noktada (yani, ana kopya seri bir program yürütme içinde başlatılması gibi).Bir nesne açık bir başlatıcı başvuruda bulunulan unutmayın bir threadprivate değişkeni ve değerinin nesnesinin değiştirilmiş değişkenin bir kopyası için ilk başvuru için önce ve sonra davranışıdır belirtilmemiş.

Özel herhangi bir değişken, bir iş parçacığı başka bir iş parçacığının kopyasını başvuru içermemelidir gibi bir threadprivate nesne.Seri bölgeler ve programın ana bölgelerde sırasında başvurular ana iş parçacığının nesne kopyasına olacaktır.

İlk paralel bölge çalýþtýktan sonra verileri threadprivate nesneleri yalnızca dinamik iş parçacıkları mekanizması devre dışı bırakılır ve iş parçacığı sayısı paralel tüm bölgeler için değişmeden kalır olmuştur devam ettirmek için garanti.

Kısıtlamalar threadprivate yönergesini aşağıdaki gibidir:

  • A threadprivate yönergesi dosya kapsamı veya ad alanı kapsam değişkenleri için herhangi bir tanım veya bildirimi dışında görünmelidir ve tüm başvurular herhangi bir değişken listesinde bulunan lexically gelmelidir.

  • Her değişken değişken listesi , bir threadprivate lexically yönergesi önündeki dosya veya ad alanı kapsamında bir değişken bildiriminde yönergesi dosya veya ad alanı kapsamında başvurmalıdır.

  • A threadprivate statik blok kapsam değişkenleri yönergesi gerekir görünür değişkenin kapsamı ve iç içe geçmiş bir kapsamda değil.Yönergesi lexically kendi listesinde değişkenleri yapılan tüm başvurular gelmelidir.

  • Her değişken değişken listesi , bir threadprivate lexically yönergesi önündeki aynı kapsam içinde bir değişken bildiriminde bloğun kapsamına yönergesinde başvurmalıdır.Değişken bildiriminde static depolama sınıfı Belirleyicisi kullanmanız gerekir.

  • Değişken alanında belirtilmişse, bir threadprivate bir çeviri birimi yönergesi içeriyorsa, onu belirtilmelidir bir threadprivate içinde bildirildiði her çeviri birimi yönergesi.

  • A threadprivate değişkeni gerekir görünmüyor dışında herhangi bir yan copyin, copyprivate, schedule, num_threads, veya , yan tümcesi.

  • Adresini bir threadprivate değişken bir adres sabiti değil.

  • A threadprivate değişkeni eksik bir tür ya da baþvuru türü değil olmalıdır.

  • A threadprivate ile açık bir başlatıcı bildirilirse pod sınıf türü değişkeniyle erişilebilir, belirli bir kopya kurucusu olmalıdır.

Nasıl bir başlatıcı görünür bir değişken değiştirme belirtilmeyen davranışı neden olur ve de nasıl yardımcı nesne ve kopyalama kurucusunu kullanarak bu sorunu önlemek aşağıdaki örnekte gösterilmektedir.

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

Çapraz referanslar:

  • Dinamik zincirlerini görmek Bölüm 3.1.7 sayfasında 39.

  • OMP_DYNAMICortam değişkeni, bkz: Bölüm 4.3 sayfasında 49.