[英]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.