我正在处理一个令人困惑的大型代码库,并且遇到这种情况。
#pragma omp parallel for
for ( int i = 0; i < N; i++) {
problemFunction();
}
void problemFunction() {
static bool inFunction;
if ( inFunction == true ) {
return;
}
else {
inFunction = true;
}
}
这会产生竞争条件吗?
最佳答案
是的,这将在执行时引起比赛(显然)。为了避免这种情况,可以使用 thread_local
(see also here)变量(此外,您的函数似乎不必要复杂):
void problemFunction() {
static thread_local bool inFunction;
inFunction = true;
}
当每个线程都有自己的变量
inFunction
时。这样,您的函数就可以与任何线程实现一起使用,而不仅限于OpenMP。关于c++ - OpenMP并行区域内函数本地的静态变量被修改:竞争条件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48959017/