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

如何在C++构造函数中正确使用call_once()?

在构造函数中使用call_once()的C++示例(基于《CPL》修改)

这是调整后的完整可编译代码,基于Stroustrup《C++ Programming Language》中的示例修改,核心目标是通过call_once()保证静态成员的线程安全初始化:

#include <mutex>   // 必须包含,call_once和once_flag的定义在这里
#include <iostream> // 用于cout输出

using namespace std; // 示例中简化代码用,实际项目按需考虑

class X { 
private: 
    static int data; 
    static once_flag initdata_flg; 
    static void init() {
        // 这里写实际的初始化逻辑,比如从配置读取、计算初始值等
        data = 42; // 示例初始化值
    }
public: 
    X() { 
        call_once(initdata_flg, &X::init); 
        cout << "** diagnostic: X::data initialized" << endl; 
    } 
    int getdata() const { return data; } 
}; 

// 静态成员必须在类外部定义,这是C++的强制要求
int X::data; 
once_flag X::initdata_flg; // 补全原代码中未完成的静态成员定义

几个关键说明:

  • call_once()的作用:不管创建多少个X的对象,init()函数只会被执行一次,而且是线程安全的——多线程环境下也不会出现竞态条件,完美替代了传统“懒汉式”单例初始化的复杂逻辑。
  • 静态成员的定义规则:类内部的static int data;和static once_flag initdata_flg;只是声明,必须在类外部提供定义(就像代码最后两行那样),否则编译器会报未定义的引用错误。
  • 头文件依赖:别忘了包含<mutex>和<iostream>,这两个是代码正常编译运行的必要条件,原示例里没写但实际必须加上。

内容的提问来源于stack exchange,提问作者SSteven

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:58:42