我正在处理一个令人困惑的大型代码库,并且遇到这种情况。

#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/

10-10 08:08