如何在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
相关产品推荐
相关产品推荐

