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

创建型——单例模式C++实现

单例模式即保证一个类只有一个实例,并提供一个访问该单例的接口。

实例

1.懒汉式

用的时候才创建单例,“懒”。

Singleton.h

#ifndef SINGLETON_H_
#define SINGLETON_H_#include <iostream>
#include <string>
#include <mutex>class Singleton {public:static Singleton* GetInstance() {if (instance_ == nullptr) {// 加锁保证多个线程并发调用getInstance()时只会创建一个实例m_mutex_.lock();if (instance_ == nullptr) {instance_ = new Singleton();}m_mutex_.unlock();}return instance_;}private:Singleton() {}static Singleton* instance_;static std::mutex m_mutex_;
};#endif  // SINGLETON_H_

这就是双重检验锁,保障了线程安全。第一个判空可加速判断是否已有单例,第二个锁内的判空是为了解决多线程问题(两个线程同时走到lock,且instance_都为nullptr)。

Singleton.cpp

#include "Singleton.h"// 静态变量instance初始化不要放在头文件中, 如果多个文件包含singleton.h会出现重复定义问题
Singleton* Singleton::instance_ = nullptr;
std::mutex Singleton::m_mutex_;

main.cpp

#include <iostream>
#include "Singleton.h"int main() {Singleton *s1 = Singleton::GetInstance();Singleton *s2 = Singleton::GetInstance();std::cout << "s1地址: " << s1 << std::endl;std::cout << "s2地址: " << s2 << std::endl;return 0;
}

编译运行:

$g++ -g main.cpp Singleton.cpp -std=c++11 -o singleton
$./singleton 
s1地址: 0x95a040
s2地址: 0x95a040

2. 饿汉式

类初始化就创建单例,GetInstance()只是获取动作,“饿”。 

Singleton.h

#ifndef SINGLETON_H_
#define SINGLETON_H_class Singleton {public:static Singleton* GetInstance() {return instance_;}private:Singleton() {}static Singleton* instance_;
};#endif  // SINGLETON_H_

Singleton.cpp

#include "Singleton.h"Singleton* Singleton::instance_ = new Singleton();

main.cpp

#include <iostream>
#include "Singleton.h"int main() {Singleton *s1 = Singleton::GetInstance();Singleton *s2 = Singleton::GetInstance();std::cout << "s1地址: " << s1 << std::endl;std::cout << "s2地址: " << s2 << std::endl;return 0;
}

编译运行:

$g++ -g main.cpp Singleton.cpp -std=c++11 -o singleton
$./singleton 
s1地址: 0x18a8040
s2地址: 0x18a8040

3. Meyers' Singleton

Meyers' Singleton是Scott Meyers提出的C++单例的推荐写法。它将单例对象作为局部static对象定义在函数内部: 

#ifndef SINGLETON_H_
#define SINGLETON_H_class Singleton {public:static Singleton& GetInstance() {static Singleton instance;return instance;}Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;private:Singleton() {}
};#endif  // SINGLETON_H_

需要C11支持(C11保证static成员初始化的线程安全)

相关文章:

创建型——单例模式C++实现

单例模式即保证一个类只有一个实例&#xff0c;并提供一个访问该单例的接口。 实例 1.懒汉式 用的时候才创建单例&#xff0c;“懒”。 Singleton.h #ifndef SINGLETON_H_ #define SINGLETON_H_#include <iostream> #include <string> #include <mutex>…...

【华为OD统一考试B卷 | 100分】执行时长(C++ Java JavaScript Python)

文章目录 题目描述输入描述输出描述ACM输入输出模式用例机考代码查重C++javascriptjavapython题目描述 为了充分发挥GPU[算力],需要尽可能多的将任务交给GPU执行,现在有一个任务数组,数组元素表示在这1秒内新增的任务个数且每秒都有新增任务。 假设GPU最多一次执行n个任务,…...

操作系统原理 —— 内存管理的概念(十八)

为什么要有内存管理 为什么要对内存进行管理&#xff0c;需要解决什么问题&#xff1f; 要回答这个问题&#xff0c;首先我们需要明白&#xff1a;进程运行时&#xff0c;需放在内存才能运行。比如在执行一个程序时&#xff0c;需将该程序的相关数据与指令装入内存才能运行。…...

GPT-4国内怎么用

GPT-4是OpenAI推出的最新的生成式AI模型&#xff0c;作为ChatGPT的进化版&#xff0c;它在回答准确性、识图能力、生成歌词和创意文本等方面有了显著的提升。然而&#xff0c;由于网络限制&#xff0c;国内用户无法直接访问官方网站。那么&#xff0c;GPT-4在国内如何使用呢&am…...

搭建LightPicture开源免费图床系统「公网远程控制」

文章目录 1.前言2. Lightpicture网站搭建2.1. Lightpicture下载和安装2.2. Lightpicture网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 转载自cpolar极点云的文章&#xff1a;【搭建私人图床】使用LightPicture开源…...

shell编程lesson06

流控制 while 和 until 循环 #!/bin/bash# while-count:display a series of numbersi1 while [ $i -le 5 ];doecho $ii$((i1)) done echo "Finished!"while命令的语法结构如下&#xff1a; while commands;do commands;done 我们可以使用while循环改进上一节中的…...

国内免费可用的ChatGPT网页版

ChatGPT 一、ChatGPT是个啥&#xff1f;二、16个国内免费的ChatGPT网站。三、ChatGPT使用方式 一、ChatGPT是个啥&#xff1f; chat&#xff1a;表示“聊天”。 GPT&#xff1a;则是Generative、Pre-trained、Transformer的缩写&#xff0c;表示“预训练语言模型”&#xff0…...

用同样的关键词测试不同的人工智能

测试词汇&#xff1a;用“电商、接口、店群”写一篇关于API接口的推广软文 返回结果&#xff1a; 人工智能1&#xff1a; 电商行业已经进入了全面数字化转型的时代&#xff0c;而API接口技术正是数字化转型的重要组成部分。随着移动端、小程序等终端越来越普及&#xff0c;A…...

shell变量类型含义 长方形面积计算 截取相应字段方法

1.总结变量的类型及含义&#xff1f; 2.实现课堂案例计算长方形面积&#xff1f;&#xff08;6种方式&#xff09; 3.定义变量urlhttps://blog.csdn.net/weixin_45029822/article/details/103568815&#xff08;通过多种方法实现&#xff09; 1&#xff09;截取网站访问的协议 …...

Java:从单线程计数器到多线程数据同步synchronized和原子类Atomic

目录 使用单线程使用多线程使用多线程 synchronized使用多线程 原子类AtomicLong 使用单线程 单线程修改计数器的值&#xff0c;没有发生问题&#xff0c;每次运行结果都是10000&#xff0c;不过程序耗时较长 package com.example;/*** 计数器*/ class Counter {private st…...

提前进入行业顶尖阵营:高性能计算实习的竞争优势

如今就业越来越内卷&#xff0c;尤其是计算机行业更是如此。加上GPT以及大模型的加持&#xff0c;各大企业纷纷降本增效&#xff0c;普通程序员逐渐失去竞争力。想要在竞争激烈的就业市场中脱颖而出&#xff0c;提前进入行业顶尖阵营是一个明智的选择。而高性能计算实习将为您提…...

Java程序设计入门教程--标识符和关键字

目录 标识符 标识符的约定 标识符 1. 定义 用来标识类名&#xff0c;变量名&#xff0c;方法名&#xff0c;类型名&#xff0c;数组名&#xff0c;文件名的有效序列称为标识符。简单地说&#xff0c;标识符就是一个名字。 2. 标识符命名规则 &#xff08;1&#xff09;大小…...

国产IC芯片自动化测试系统ATECLOUD,助力芯片测试自动化

IC芯片测试成本是影响制造和加工成本的重要因素。在某些情况下&#xff0c;测试成本可能占到器件总成本的40%左右。为了降低测试成本&#xff0c;可以优化测试程序并研发多工位测试。同时&#xff0c;必须平衡良品率和测试时间&#xff0c;以实现最佳的成本控制。本篇文章纳米软…...

BeanFactory和ApplicationContext有什么区别?

BeanFactory和ApplicationContext有什么区别&#xff1f; BeanFactory和ApplicationContext有什么区别&#xff1f; BeanFactory和ApplicationContext有什么区别&#xff1f; BeanFactory (轻量级) 和ApplicationContext(高级特性和框架)是Spring的两大核心接口&#xff0c;都…...

js的BOM对象中的window、location使用

说明&#xff1a;BOM的全称是Browser Object Model&#xff0c;浏览器对象模型&#xff0c;有Window&#xff08;浏览器窗口&#xff09;、Navigator&#xff08;浏览器&#xff09;、Screen&#xff08;屏幕&#xff09;、History&#xff08;历史记录&#xff09;和Location&…...

DAY 68 redis高可用的主从复制、哨兵、cluster集群

Redis 高可用 什么是高可用 在web服务器中&#xff0c;高可用是指服务器可以正常访问的时间&#xff0c;衡量的标准是在多长时间内可以提供正常服务(99.9%、99.99%、99.999%等等)。 但是在Redis语境中&#xff0c;高可用的含义似乎要宽泛一些&#xff0c;除了保证提供正常服…...

leetcode 1209 学会删除字符串

删除字符串的经典kotlin操作&#xff1a; val mTemp (temp.text).replace(Regex("℃"),"") 以下是题目&#xff01; 1209. 删除字符串中的所有相邻重复项 II 提示 中等 174 相关企业 给你一个字符串 s&#xff0c;「k 倍重复项删除操作」将会从 s…...

JavaScript6

一、概念 ES6是JavaScript语言的标准。 新特性&#xff1a;let和const命令、变量的解构赋值、字符串函数对象数组等扩展。 环境准备&#xff1a;需要安装NodeJs。 二、新特性 1、let let命令用来声明变量。他的用法类似var&#xff0c;但所声明的变量&#xff0c;只在let命令…...

轻松安装Redis:不用担心配置问题

一、Centos安装Redis 1.安装 EPEL 源 Redis 不在 CentOS 官方仓库中&#xff0c;需要安装 EPEL 源才能访问到 Redis 软件包。运行以下命令安装 EPEL 源&#xff1a; sudo yum install epel-release 2.安装 Redis 使用以下命令安装 Redis&#xff1a; sudo yum install re…...

ChatGPT学习研究总结

目录 ChatGPT研究总结 一、程序接入用途不大 二、思考&#xff1a;如何构建一个类似ChatGPT的自定义模型 一些ChatGPT研究学习资料&#xff08;来源网络&#xff09; &#xff08;1&#xff09;一文读懂ChatGPT模型原理 &#xff08;2&#xff09;MATLAB科研图像处理——…...

SDMatte算法原理浅析:从卷积神经网络看图像分割技术

SDMatte算法原理浅析&#xff1a;从卷积神经网络看图像分割技术 1. 效果展示&#xff1a;当AI学会"精准抠图" 先来看一组实际案例。左边是原始图片&#xff0c;右边是SDMatte算法的处理结果&#xff1a; 你会注意到&#xff0c;即便是复杂场景下的发丝、半透明物体…...

Instructions版本迁移终极指南:从1.x到2.x的5个关键升级步骤

Instructions版本迁移终极指南&#xff1a;从1.x到2.x的5个关键升级步骤 【免费下载链接】Instructions Create walkthroughs and guided tours (coach marks) in a simple way, with Swift. 项目地址: https://gitcode.com/gh_mirrors/in/Instructions Instructions是一…...

Qwen3.5-9B-AWQ-4bit LSTM时间序列预测模型原理与调参详解

Qwen3.5-9B-AWQ-4bit LSTM时间序列预测模型原理与调参详解 1. 引言&#xff1a;当LSTM遇见大语言模型 时间序列预测一直是机器学习领域的经典问题。从股票价格预测到电力负荷分析&#xff0c;传统LSTM模型因其出色的序列建模能力而广受欢迎。但随着大语言模型(LLM)的崛起&…...

STEP3-VL-10B效果对比实测:10B参数碾压GLM-4.6V/Qwen3-VL-Thinking

STEP3-VL-10B效果对比实测&#xff1a;10B参数碾压GLM-4.6V/Qwen3-VL-Thinking 最近多模态大模型圈子里有个消息挺火的&#xff1a;阶跃星辰开源了一个只有10B参数的视觉语言模型STEP3-VL-10B&#xff0c;据说在好几个评测基准上把那些参数量大它10倍甚至20倍的模型都给比下去…...

跨平台文件同步:OpenClaw+百川2-13B-4bits量化模型智能归档方案

跨平台文件同步&#xff1a;OpenClaw百川2-13B-4bits量化模型智能归档方案 1. 为什么需要智能文件归档 作为一个长期在多台设备间切换工作的开发者&#xff0c;我的文件管理一直处于混乱状态。同一份文档可能同时存在于Mac的Downloads文件夹、Windows桌面的"临时"目…...

5分钟快速上手MUNIT:从零开始构建你的第一个图像翻译模型

5分钟快速上手MUNIT&#xff1a;从零开始构建你的第一个图像翻译模型 【免费下载链接】MUNIT Multimodal Unsupervised Image-to-Image Translation 项目地址: https://gitcode.com/gh_mirrors/mu/MUNIT MUNIT&#xff08;Multimodal Unsupervised Image-to-Image Trans…...

石大胜华冲刺港股:年营收68亿 亏588万 郭天明控制22%股权

雷递网 雷建平 4月5日石大胜华新材料集团股份有限公司&#xff08;简称&#xff1a;“石大胜华”&#xff09;日前递交招股书&#xff0c;准备在港交所上市。石大胜华已在A股上市&#xff0c;截至周五收盘&#xff0c;石大胜华股价为80.75元&#xff0c;市值为188亿元。一旦在港…...

MySQL后端开发核心知识点

一、存储引擎&#xff08;只重点 InnoDB&#xff09;MySQL 5.5 以后默认引擎是 InnoDB&#xff0c;也是现代企业项目唯一使用的引擎。InnoDB 特点&#xff1a;支持 事务支持 行级锁&#xff0c;并发性能好支持 外键&#xff08;实际开发基本不用&#xff09;基于 B 树索引结构依…...

ZYNQ AXI_DMA配置避坑指南:如何避免DDR3数据传输中的栈区溢出

ZYNQ AXI_DMA配置避坑指南&#xff1a;如何避免DDR3数据传输中的栈区溢出 在嵌入式系统开发中&#xff0c;内存管理往往是决定项目成败的关键因素之一。最近接手一个ZYNQ项目时&#xff0c;我遇到了一个令人头疼的问题&#xff1a;当使用AXI_DMA从PL端向PS端的DDR3内存传输大量…...

贾子科学定理(Kucius Science Theorem):重构科学本质——公理驱动与结构化范式的确立

贾子科学定理&#xff08;Kucius Science Theorem&#xff09;&#xff1a;重构科学本质——公理驱动与结构化范式的确立摘要&#xff1a; 贾子科学定理颠覆传统“可证伪性”标准&#xff0c;提出科学本质为“公理驱动可结构化”&#xff0c;构建TMM三层体系&#xff08;真理层…...