静态初始化的哪部分是线程安全的?静态局部变量执行次数问询
关于C++静态初始化线程安全的问题解答
1. 静态初始化的哪部分是线程安全的?
在C++11及之后的标准里,分两种核心场景:
- 函数内的静态局部变量:它的首次初始化过程是线程安全的。当多个线程第一次进入包含该静态变量的函数时,编译器会自动生成同步逻辑,保证只有一个线程执行初始化操作,其他线程会阻塞直到初始化完成,之后所有线程直接使用已初始化的变量。
- 全局/命名空间级的静态变量:
- 若是常量初始化(比如
static const int num = 10;,编译期就能确定值),属于程序启动前完成的操作,天然线程安全; - 若是动态初始化(比如
static int val = calculate();,需要运行时调用函数生成值),C++11要求实现保证初始化过程线程安全——同样只有一个线程执行初始化表达式,其他线程等待。注意:全局静态变量在不同编译单元的初始化顺序是未定义的,但这和线程安全是两个独立问题。
- 若是常量初始化(比如
2. 并发调用get_global_bool()时,get_the_value()会不会被执行多次?
不会。按照C++11及以后的标准,函数内的静态局部变量b的初始化是原子性的一次性操作:
- 当多个线程同时进入函数,第一个触发初始化的线程会执行
get_the_value()并完成b的初始化; - 其他线程会被阻塞,直到
b初始化完成后,直接返回已初始化的b值,不会再调用get_the_value()。
无论多少线程并发调用,get_the_value()只会被执行一次。
内容的提问来源于stack exchange,提问作者cppguy
相关产品推荐
相关产品推荐

