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

embedded/2024/11/22 23:59:40/

一:概述:

        在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.ppmy.cn/embedded/139739.html

相关文章

解读缓存问题的技术旅程

目录 前言1. 问题的突发与初步猜测2. 缓存的“隐身术”3. 缓存策略的深层优化4. 反思与感悟结语 前言 那是一个普通的工作日&#xff0c;团队例行的早会刚刚结束&#xff0c;我正准备继续优化手头的模块时&#xff0c;突然收到了用户反馈。反馈的内容是部分数据显示异常&#…

Thymeleaf模板引擎生成的html字符串转换成pdf

依赖引入implementation("org.springframework.boot:spring-boot-starter-thymeleaf")implementation("org.xhtmlrenderer:flying-saucer-pdf")将ITemplateEngine注入到spring管理的类中&#xff0c; Context context new Context(); context.setVariable…

【实用技能】使用 TX Text Control 创建带有嵌入式附件的 PDF 文档

TX Text Control .NET Server for ASP.NET&#xff08;下载试用最新版&#xff09;是一款Web应用程序的文档处理控件&#xff0c;包括用于 ASP.NET、ASP.NET Core 和 Angular 的文档编辑和查看的客户端包。目前TX Text Control .NET Server for ASP.NET 支持 .NET 5、.NET 6 和…

uniapp 城市选择插件

uniapp城市选择插件 如上图 地址 完整demo <template><view><city-selectcityClick"cityClick":formatName"formatName":activeCity"activeCity":hotCity"hotCity":obtainCitys"obtainCitys":isSearch&quo…

【系统架构设计师】真题论文: 论软件需求获取技术及应用(包括解题思路和素材)

更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 真题题目(2011年 试题4)解题思路论文素材参考软件需求获取的目标与重要性软件需求获取技术软件需求获取技术的应用案例真题题目(2011年 试题4) 软件需求是指用户对新系统在功能、行为、性能、设计约束等方面的…

学习路之phpstudy--安装mysql5.7后在my.ini文件中无法修改sql_mode

windows环境下使用phpstudy安装mysql5.7后需要修改mysql中的sql_mode配置&#xff0c;但是在phpstudy中打开mysql配置文件my.ini后&#xff0c; 通过查找找不到sql_mode或sql-mode&#xff0c; 此时无法在my.ini文件中直接进行修改&#xff0c;可以使用mysql命令进行修改&#…

数据分析-49-时间序列信息编码之采用虚拟变量

文章目录 1 基本概念1.1 虚拟变量(one-hot)1.2 时间特征2 模拟数据2.1 日期序列2.2 目标序列3 编码虚拟变量(one-hot)3.1 年份编码3.2 月份编码3.3 星期几编码4 拟合模型4.1 构建数据集(每月编码)4.2 构建数据集(每日编码)5 参考附录1 基本概念 1.1 虚拟变量(one-hot) 虚拟变…

项目上线之后,出现过线上问题吗?怎么排查和解决的?

在面试中&#xff0c;相信大家都遇到过这个问题。 本文将通过训练营内部抽奖项目的问题案例——抽奖结果通知延迟和抽奖列表加载缓慢&#xff0c;讲清楚它们的解决方法和优化策略。 回答思路 这些问题都是在我负责的项目中出现过的&#xff0c;给我留下了深刻的印象。 一、…