1

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

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?

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

4

1 回答 1

7

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

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

std::atomic<bool> flag = false;

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

于 2019-06-18T21:10:06.760 回答