You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

静态初始化的哪部分是线程安全的?静态局部变量执行次数问询

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 00:00:07