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

单例模式在C++中的使用:原子操作

原子操作

在 C++11 中将原子操作纳入了标准,我们可以通过标准提供的原子操作来处理该问题。

通过给原子变量设置 std::std::memory_order_xxx 来防止 CPU 的指令重排操作。

#include <atomic> #include <mutex> class Singleton { private: static std::atomic<Singleton*> s_instancePtr; static std::mutex s_mutex; public: static Singleton* instance() { Singleton* sin = s_instancePtr.load(std::memory_order_acquire); if (nullptr == s_instancePtr) { std::lock_guard<std::mutex> lock(s_mutex); sin = s_instancePtr.load(std::memory_order_relaxed); if (nullptr == s_instancePtr) { sin = new Singleton(); s_instancePtr.store(sin, std::memory_order_release); } } return sin; } private: // 省略构造函数的处理 }; std::atomic<Singleton*> Singleton::s_instancePtr; std::mutex Singleton::s_mutex;

Meyers单例

其实还有一种简单的单例方式,那就是所谓的 Meyers 单例。

该方式在函数内部定义一个局部静态变量,并直接将该变量返回即可。

在 C++11 中保证了会以线程安全的方式初始化一个静态局部变量,因此可以放心使用。

static Singleton& instance() { static Singleton s_instance; return s_instance; }

在《Effective C++》一书中提到:任何一种 non-const static 对象,不论它是 local 还是 non-local,在多线程环境下“等待某事发生”都会有麻烦。

处理这个麻烦的一种做法是:在程序的单线程启动阶段,手工调用所有 reference-returning 函数,这可能消除与初始化有关的“竞速形式”。

http://www.gsyq.cn/news/1391473.html

相关文章:

  • 从Matlab到Vivado:高效生成.coe文件并配置ROM IP核的完整工作流
  • Node js 服务中如何集成 Taotoken 实现统一的多模型 API 调用
  • 2026新榜单:三门峡母婴除甲醛CMA甲醛检测治理公司推荐品牌排行榜 - 金诚回收
  • 美国机器人捡快递,给中国机器人上了一课?
  • 硅量子点LED:利用奥斯特瓦尔德熟化调控发光波长的工艺详解
  • 3步精通Winhance中文版:彻底重塑你的Windows使用体验
  • 终极指南:如何用AutoRaise实现macOS鼠标悬停窗口自动提升与焦点管理
  • “Lovable用不起来”的真相:我们暗访了37家物业公司,发现91%败在这1个角色权限设计盲区
  • Mi-Create 终极指南:免费制作个性化小米手表表盘的完整教程
  • 常州黄金上门回收怕被坑?福运来手把手教你卖高价 - 黄金回收
  • NoFences:免费的Windows桌面分区管理工具终极指南
  • 避坑指南:用Springer的sn-basic模板投稿时,如何快速搞定参考文献的序号排序问题?
  • 菠菜叶子病害检测数据集VOC+YOLO格式1735张5类别均为单叶子
  • 终极飞行模拟编程指南:如何用XPlaneConnect控制虚拟天空
  • Win11Debloat:一键优化Windows系统性能的终极指南
  • 终极指南:为什么Pyfa是EVE Online玩家必备的船舰装配工具
  • Linux 命令入门:读懂 ls -l 的每一列
  • PlantUML Server完整指南:在线UML绘图工具深度解析
  • 基于BERT与图卷积网络的领域情感词典自适应构建方法
  • 主题加权核方法:融合LDA与词嵌入的文本分类新思路
  • Linux手动脚本 vs Dockerfile部署:核心区别与适用场景
  • 2026职场人AI学习路线图(小白收藏版):用AI提升竞争力,抓住未来机遇!
  • Git用户名配置:从身份可信度到企业级多环境治理
  • Unity Spine动态换肤内存优化与性能调优实战
  • rsync-daemon + lsyncd实现文件近实时备份
  • MyComputerManager:终极Windows系统界面优化与清理指南
  • 基于多模态边聚类的LBSN重叠社区发现与用户画像构建
  • 辟谣科普|别再混淆!巴马百年≠百岁人饮用水,二者无任何关联 - 中媒介
  • 告别手动下载:用ncbi-genome-download轻松获取NCBI基因组数据
  • 使用 TaoToken CLI 工具一键配置多开发环境下的 API 接入信息