c++ - OpenMP 并行区域内函数的局部静态变量被修改 : race condition?

标签 c++ openmp

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

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

相关文章:

c++ - 从 vector 初始化数组

c++ - PROCESS_MEMORY_COUNTERS_EX 创建不可靠的 PrivateUsage 字段,为什么?

for-loop - 有没有办法控制 OpenMP parallel_for 构造的分区?

c++ - 使用 openmp 在 C++ 中进行并行编程

c++ - Visual Studio : Macro definition of snprintf conflict

c++ - C++ 和数组索引中的前缀运算符奇怪性

c++ - 如何在不使用归约的情况下避免竞争条件

c - 采用并行处理的 OpenMP 基本温度建模比串行代码花费的时间更长

c - 没有得到正确的总和 - openmp

c++ - 奥格/沃比斯 : _ov_fopen cannot be found