静态结构体初始化的线程安全性:C与C++的差异探讨
静态结构体初始化的线程安全性:C与C++的差异
C语言情况
- 示例里的静态结构体
t用编译期常量完成初始化,属于C标准定义的「静态初始化」。这类初始化会在程序启动阶段(main函数执行前)完成,完全不涉及运行时线程调度。不管多少线程调用foo,结构体都已提前初始化完毕,不存在线程安全问题。 - 补充:即便C11引入了动态初始化的线程安全要求,你的代码也不涉及动态初始化,因此所有C标准版本下都是线程安全的。
C++语言情况
- C++11及之后标准:C++11明确规定,函数内的静态局部变量会在第一个访问它的线程中完成初始化,编译器必须保证初始化过程的线程安全性——其他线程会等待初始化完成后再访问,结构体只会被初始化一次,完全线程安全。
- C11之前标准(C98/03):旧标准没有对静态局部变量的初始化线程安全性做要求。如果多个线程同时进入
foo函数,可能触发多次初始化,或出现初始化过程中的竞态条件,此时不属于线程安全场景。
内容的提问来源于stack exchange,提问作者fjanisze
相关产品推荐
相关产品推荐

