线程上下文上的静态存储对象优化

Joã*_*ulo 1 c++ multithreading c++11 storage-duration

编译器可以在多线程程序上下文中优化静态存储对象吗?我问它是否知道例如声明为静态的变量在线程中调用的函数中使用时是否会产生副作用。

bool flag = false; // static storage duration object

void f(){ //function called in a thread
  flag = false;
  // do some work...
  flag = true;
}

//a possible representation of the code above after optimization
void f(){
  flag = true;
  // do some work...
} // is this possible to happen?
Run Code Online (Sandbox Code Playgroud)

我从这里阅读了一些答案,但没有找到任何可以帮助的内容。

Nat*_*ica 7

静态存储时间不会影响线程安全。在您的示例中,第二个代码块将是合法的,只要重新排序不会破坏其中的任何内容f

您仍然需要对任何线程写入的所有共享对象进行同步。在这种情况下,你可以得到,通过使用std::atomic<bool>flag

std::atomic<bool> flag = false;
Run Code Online (Sandbox Code Playgroud)

线程安全的规则是,如果您有一个在多个线程之间共享的对象,并且其中至少有一个是编写器,则需要同步。如果不这样做,那么您的数据争用是未定义的行为。