仿商城版淘宝客网站源码,在线教育oem平台,重庆建设信息工程信息网,比较顺口的公司名字一#xff1a;概述#xff1a; 在C编程中#xff0c;call_once 是一种机制#xff0c;用于确保某个函数或代码段在多线程环境下仅被调用一次。这种机制常用于初始化资源、配置全局变量或执行只需执行一次的逻辑。在 C11 标准中#xff0c;std::call_once 是由标准库提供的…一概述 在C编程中call_once 是一种机制用于确保某个函数或代码段在多线程环境下仅被调用一次。这种机制常用于初始化资源、配置全局变量或执行只需执行一次的逻辑。在 C11 标准中std::call_once 是由标准库提供的工具它与 std::once_flag 配合使用能够实现线程安全的一次性初始化。
二工作原理
std::once_flag是一个标志标识某段代码是否已经被调用过。std::call_once接收一个 std::once_flag 和一个函数/可调用对象只在第一次调用时执行后续调用直接返回
三特点和优点
线程安全即使多个线程同时调用std::call_once 也保证函数只执行一次。性能优化相比手写的双重检查锁机制std::call_once 更简洁、易用且高效。无锁实现在实现细节上现代标准库可能会使用无锁算法减少锁竞争的开销。
四例子线程安全的单例模式
#include iostream
#include mutex// 单例类 MySingleton
class MySingleton {private:static std::once_flag initInstanceFlag; // 标志位确保初始化函数只调用一次static MySingleton * instance; // 指向单例实例的静态指针// 私有化构造函数和析构函数防止外部创建或销毁实例MySingleton() default;~MySingleton() default;public:// 删除拷贝构造函数和赋值运算符防止复制或赋值单例对象MySingleton(const MySingleton) delete;MySingleton operator (const MySingleton) delete;// 获取单例实例的方法static MySingleton * getInstance() {// 使用 std::call_once 确保 initSingleton 只被调用一次std::call_once(initInstanceFlag, MySingleton::initSingleton);return instance;}// 初始化单例实例的静态方法static void initSingleton() {instance new MySingleton();}
};// 定义静态成员变量初始化为空
MySingleton * MySingleton::instance nullptr;
std::once_flag MySingleton::initInstanceFlag;int main() {// 输出空行仅用于美化输出std::cout \n;// 第一次调用 getInstance 时初始化单例对象std::cout MySingleton::getInstance(): MySingleton::getInstance() \n;// 第二次调用 getInstance不会重新初始化返回同一个实例std::cout MySingleton::getInstance(): MySingleton::getInstance() \n;std::cout \n; // 输出空行美化输出
}