当前位置: 首页 > news >正文

C++ 并发专题 - 线程安全的单例模式

一:概述:

        在C++编程中,call_once 是一种机制,用于确保某个函数或代码段在多线程环境下仅被调用一次。这种机制常用于初始化资源、配置全局变量或执行只需执行一次的逻辑。在 C++11 标准中,std::call_once 是由标准库提供的工具,它与 std::once_flag 配合使用,能够实现线程安全的一次性初始化。

二:工作原理:

  1. std::once_flag:是一个标志,标识某段代码是否已经被调用过。
  2. std::call_once:接收一个 std::once_flag 和一个函数/可调用对象,只在第一次调用时执行,后续调用直接返回

三:特点和优点

  1. 线程安全:即使多个线程同时调用,std::call_once 也保证函数只执行一次。
  2. 性能优化:相比手写的双重检查锁机制,std::call_once 更简洁、易用且高效。
  3. 无锁实现:在实现细节上,现代标准库可能会使用无锁算法,减少锁竞争的开销。

四:例子(线程安全的单例模式)

#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'; // 输出空行,美化输出
}

http://www.lryc.cn/news/487363.html

相关文章:

  • Spring Boot汽车世界:资讯与技术的交汇
  • 力扣 LeetCode 541. 反转字符串II(Day4:字符串)
  • Django5 2024全栈开发指南(一):框架简介、环境搭建与项目结构
  • Uniapp运行环境判断和解决跨端兼容性详解
  • Linux设置开机自动执行脚本 rc-local
  • 驱动开发小问题 -记录一下
  • 学习笔记018——若依框架数据权限功能的实现
  • Nginx文件下载服务器搭建
  • AWD脚本编写_1
  • HarmonyOS 如何获取设备信息(系统、版本、网络连接状态)
  • 2411rust,1.80
  • FPGA 第6讲 简单组合逻辑多路选择器
  • Android Studio开发学习(五)———LinearLayout(线性布局)
  • 大模型(LLMs)RAG 版面分析------文本分块面
  • Web3游戏先锋 Big Time Studios 重磅推出 $OL 通证,赋能 Open Loot 游戏平台
  • Linux—ln(link files)命令使用方法(How to create links on Linux)
  • 学习日记_20241110_聚类方法(K-Means)
  • 解决Oracle DECODE函数字符串截断问题的深度剖析20241113
  • 开源模型应用落地-语音转文本-whisper模型-AIGC应用探索(二)
  • PHP框架 单一入口和多入口以及优缺点
  • PhpSpreadsheet导出图片
  • AI 提示词(Prompt)入门 十:最佳实践|详细询问,提供细节!
  • web应用安全和信息泄露预防
  • 《人工智能深度学习的基本路线图》
  • 基于Java Springboot宠物猫售卖管理系统
  • 力扣-Hot100-链表其三【算法学习day.36】
  • iOS逆向入门:使用theos注入第三方依赖库
  • JavaScript 原型
  • 力扣 LeetCode 20. 有效的括号(Day5:栈与队列)
  • git使用及上线流程(仅为我工作中常用)