编译器能否在多线程程序上下文中优化静态存储对象?例如,我要求它知道声明为静态的变量在线程中调用的函数中使用时是否会产生副作用。
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?
我从here读了一些答案,但我没有找到任何有帮助的东西。
最佳答案
静态存储持续时间对线程安全没有影响。在您的示例中,只要重新排序不会破坏 f
中的任何内容,第二个代码块就是合法的。 .
您仍然需要对任何线程写入的所有共享对象进行同步。在这种情况下,您可以通过使用 std::atomic<bool>
来获得它。对于 flag
喜欢
std::atomic<bool> flag = false;
线程安全的规则是,如果你有一个在多个线程之间共享的对象,并且至少其中一个是写入者,那么你就需要同步。如果你不这样做,那么你就会发生数据竞争,这是未定义的行为。
关于c++ - 线程上下文的静态存储对象优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56657046/