簡體   English   中英

修改了 OpenMP 並行區域內函數的靜態變量:競爭條件?

[英]static variable local to function within OpenMP parallel region is modified: race condition?

我正在處理一個大而混亂的代碼庫,我遇到了這樣的情況。

#pragma omp parallel for 
for ( int i = 0; i < N; i++) {
  problemFunction();
}

void problemFunction() {

  static bool inFunction;
  if ( inFunction == true ) {
    return;
  }
  else {
    inFunction = true;
  }
}

這會產生競爭條件嗎?

與通常駐留在線程堆棧(私有)上的自動局部變量不同,具有靜態存儲類的局部變量駐留在進程的數據段中,因此在執行給定函數的所有線程之間共享,因此您的代碼包含競爭條件. 為了防止共享,您應該使用 OpenMP 的threadprivate構造:

void problemFunction() {
  static bool inFunction;
  #pragma omp threadprivate(inFunction)

  if ( inFunction == true ) {
    return;
  }
  else {
    inFunction = true;
  }
}

這會將變量的存儲位置從數據段更改為所謂的線程本地存儲 (TLS)。 保留原來的static語義,即在函數調用之間保留值,但現在每個線程都有自己的副本。 threadprivate構造應該總是變量聲明之后。

是的,這將導致執行競爭(顯然)。 為了避免,您可以使用thread_local (另見此處)變量(另外,您的函數似乎沒有必要復雜):

void problemFunction() {
  static thread_local bool inFunction;
  inFunction = true;
}

當每個線程都有自己的變量inFunction 通過這種方式,您的函數適用於任何線程實現,而不僅僅是 OpenMP。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM