线程上下文的静态存储对象优化
Static storage objects optimization on thread context
编译器可以在多线程程序上下文中优化静态存储对象吗?例如,我要求它知道声明为静态的变量在线程中调用的函数中使用时是否会产生副作用。
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
.
中的任何内容,第二个代码块就是合法的
您仍然需要对任何线程写入的所有共享对象进行同步。在这种情况下,您可以通过对 flag
使用 std::atomic<bool>
来获得它,例如
std::atomic<bool> flag = false;
线程安全的规则是,如果你有一个对象在多个线程之间共享,并且至少其中一个是写入器,那么你就需要同步。如果你不这样做,那么你有一个数据竞争,这是未定义的行为。
编译器可以在多线程程序上下文中优化静态存储对象吗?例如,我要求它知道声明为静态的变量在线程中调用的函数中使用时是否会产生副作用。
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
.
您仍然需要对任何线程写入的所有共享对象进行同步。在这种情况下,您可以通过对 flag
使用 std::atomic<bool>
来获得它,例如
std::atomic<bool> flag = false;
线程安全的规则是,如果你有一个对象在多个线程之间共享,并且至少其中一个是写入器,那么你就需要同步。如果你不这样做,那么你有一个数据竞争,这是未定义的行为。