Jon*_*pan 10 c++ static multithreading constants
即,即使在多线程环境中,预计以下内容是否会正确执行?
int dostuff(void) {
static int somevalue = 12345;
return somevalue;
}
Run Code Online (Sandbox Code Playgroud)
或者是多个线程可以调用它,还有一个调用可以&somevalue在执行开始之前返回任何垃圾?
Ada*_*wen 10
该标准的第6.7节有这样的说法:
具有静态存储持续时间的所有本地对象的零初始化在任何其他初始化发生之前执行.在首次输入块之前,初始化具有使用常量表达式初始化的静态存储持续时间的POD类型的本地对象.允许实现在允许实现静态初始化具有命名空间范围内的静态存储持续时间的对象的相同条件下,以静态存储持续时间执行其他本地对象的早期初始化.否则,在第一次控制通过其声明时初始化这样的对象; 这样的对象在初始化完成时被认为是初始化的.如果通过抛出异常退出初始化,则初始化未完成,因此下次控制进入声明时将再次尝试初始化.如果控件在初始化对象时重新输入声明(递归),则行为未定义.
因此,如果它是POD类型,那么看起来初始化在启动新线程之前在启动时发生.对于非POD类型,它更复杂,标准说行为是未定义的(除非在其他地方它说明了初始化期间的线程安全性).
我碰巧知道在初始化非POD对象时,GCC会抓取一个互斥锁以防止它被初始化两次(我知道这是因为我曾经意外地递归初始化静态对象而使程序死锁).
不幸的是,我不能告诉你这是否是其他编译器的情况,或者它是在标准的其他地方强制执行的.
小智 2
来自 C++ 标准,第 6.7 节:
具有用常量表达式初始化的静态存储持续时间的 POD 类型 (3.9) 的本地对象在首次进入其块之前进行初始化。
这意味着函数级静态对象必须在第一次进入函数时初始化,而不一定是在整个进程初始化时初始化。此时,多个线程很可能正在运行。
| 归档时间: |
|
| 查看次数: |
1089 次 |
| 最近记录: |