我正在处理一个巨大的令人困惑的代码库,并且我遇到了这样的情况。
#pragma omp parallel for
for ( int i = 0; i < N; i++) {
problemFunction();
}
void problemFunction() {
static bool inFunction;
if ( inFunction == true ) {
return;
}
else {
inFunction = true;
}
}
这会产生竞争条件吗?
最佳答案
与通常驻留在线程堆栈(私有(private))上的自动局部变量不同,具有静态存储类的局部变量驻留在进程的数据段中,因此在执行给定函数的所有线程之间共享,因此您的代码包含竞争条件。为了防止共享,您应该使用 OpenMP 的 threadprivate
构造:
void problemFunction() {
static bool inFunction;
#pragma omp threadprivate(inFunction)
if ( inFunction == true ) {
return;
}
else {
inFunction = true;
}
}
这会将变量的存储位置从数据段更改为所谓的线程本地存储 (TLS)。保留了原始的静态语义,即值在函数调用之间保留,但现在每个线程都有自己的拷贝。 threadprivate
构造应始终位于变量声明之后。
关于c++ - OpenMP 并行区域内函数的局部静态变量被修改 : race condition?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48959017/