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

C++ 常用设计模式

1、单例模式

一个类只有一个实例,提供一个全局访问点来访问这个实例。
分为懒汉模式和饿汉模式:

  • 懒汉模式就是 只有用到这个实例才会初始化对象并返回 (调用了对外的接口才实例化对象)
  • 饿汉模式就是 不管用不用得到,都先构造出来,先初始化

双重锁的懒汉模式:

#include <mutex>class SingeLazy {
private:SingeLazy() {}SingeLazy(const SingleLazy& ) = delete;SingeLazy& operator= (const SingleLazy& ) = delete;static SingleLazy* instance;static mutex i_mutex;public:static SingleLazy* getInstance() {if (instance == nullptr) {mutex.lock();if (instance == nullptr) {instance = new SingleLazy();}mutex.unlock();}return instance;
}
};
SingleLazy* SingleLazy::instance = nullptr;
mutex SingleLazy::i_mutex; // 类外初始化

双重锁机制(Double-Checked Locking)用于确保单例对象只被创建一次,并且提高线程安全性和性能。

为什么要进行第二次检查 if (instance == nullptr)
当第一个线程获得锁并创建单例对象时,其他等待的线程可能已经通过了第一次检查 if (instance == nullptr),并准备进入加锁阶段。如果没有第二次检查,当第一个线程释放锁之后,第二个线程会获得锁并尝试再次创建对象。

场景描述:

  • 线程A进入 getInstance(),通过了第一次检查,发现 instance == nullptr,然后加锁并创建实例。
  • 线程B几乎同时进入 getInstance(),也通过了第一次检查,因为当时 instance 还没被创建,但它被阻塞在锁等待状态。
  • 当线程A创建了实例并释放锁,线程B获得锁,并进入锁定区域。如果没有第二次检查,线程B会认为 instance 仍然是
    nullptr,并再次尝试创建实例。

因此,第二次检查的作用是防止在第一个线程创建实例后,其他线程重复创建实例

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 有源滤波器UAF42
  • Golang协程泄漏定位和排查
  • 项目小总结
  • 在CentOS上搭建NFS服务器
  • rtmp推流
  • yolov8多任务模型-目标检测+车道线检测+可行驶区域检测-yolo多检测头代码+教程
  • 硬件工程师笔试面试——变压器
  • OpenAl o1论文:Let’s Verify Step by Step 快速解读
  • 模版进阶(template)
  • MySQL行转列
  • 聊聊Netty对于内存方面的优化
  • 使用 Sahi 实现 Web 自动化测试
  • HeterGCL-Graph Contrastive Learning Framework on Heterophilic Graph
  • 魅族20机型 M2381“工程固件”作用分析以及写入步骤
  • 机器学习,深度学习,AGI,AI的概念和区别
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • Apache的80端口被占用以及访问时报错403
  • ES6 ...操作符
  • Git同步原始仓库到Fork仓库中
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • js学习笔记
  • mongodb--安装和初步使用教程
  • MYSQL 的 IF 函数
  • React-flux杂记
  • SpringBoot几种定时任务的实现方式
  • ucore操作系统实验笔记 - 重新理解中断
  • vue 个人积累(使用工具,组件)
  • vue:响应原理
  • 第2章 网络文档
  • 关于 Cirru Editor 存储格式
  • 技术胖1-4季视频复习— (看视频笔记)
  • 实现菜单下拉伸展折叠效果demo
  • 一道面试题引发的“血案”
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 自制字幕遮挡器
  • RDS-Mysql 物理备份恢复到本地数据库上
  • Semaphore
  • 积累各种好的链接
  • ​【经验分享】微机原理、指令判断、判断指令是否正确判断指令是否正确​
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • ###STL(标准模板库)
  • #图像处理
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (SpringBoot)第七章:SpringBoot日志文件
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (定时器/计数器)中断系统(详解与使用)
  • (多级缓存)缓存同步
  • (二)十分简易快速 自己训练样本 opencv级联lbp分类器 车牌识别
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (学习日记)2024.02.29:UCOSIII第二节