为了避免单例类在多线程中重复的创建,下面提供了两种解决方法:

  1.互斥锁+双重检查

  2.std::call_once()

 

方法一:互斥锁+双重检查

#include <iostream>
#include <thread>
#include <mutex>
#include <list>
using namespace std; std::mutex my_mutex; // 创建一个单例类
class MyCAS
{
private:
MyCAS() {} // 私有化构造函数
static MyCAS* m_instance; // 静态成员变量 public:
static MyCAS* GetInstance()
{
// 2.双重检查
if (m_instance == NULL)
{
// 1.互斥锁
std::lock_guard<std::mutex> mylock(my_mutex);
if (m_instance == NULL)
{
m_instance = new MyCAS();
static CGarhuishou ci;
}
}
return m_instance;
} // 类中封装一个类,用来析构单例类
class CGarhuishou
{
public:
~CGarhuishou()
{
if (MyCAS::m_instance)
{
delete MyCAS::m_instance;
MyCAS::m_instance = NULL;
}
}
}; void func() { cout << "test 123" << endl; }
}; // 类静态变量初始化
MyCAS* MyCAS::m_instance = NULL; // 线程入口函数
void myThread()
{
cout << "线程开始执行" << endl;
MyCAS* p = MyCAS::GetInstance();
cout << "线程结束执行" << endl;
} int main()
{
// 创建对象,但会对象指针
std::thread t1(myThread);
std::thread t2(myThread); t1.join();
t2.join(); return 0;
}

方法二:std::call_once()

#include <iostream>
#include <thread>
#include <mutex>
#include <list>
using namespace std; std::once_flag g_flag; // 创建一个单例类
class MyCAS
{
// 只被调用一次
static void CreateInstance()
{
m_instance = new MyCAS();
static CGarhuishou ci;
} private:
MyCAS() {} // 私有化构造函数
static MyCAS* m_instance; // 静态成员变量 public:
static MyCAS* GetInstance()
{
std::call_once(g_flag, CreateInstance);
return m_instance;
} // 类中封装一个类,用来析构单例类
class CGarhuishou
{
public:
~CGarhuishou()
{
if (MyCAS::m_instance)
{
delete MyCAS::m_instance;
MyCAS::m_instance = NULL;
}
}
}; void func() { cout << "test 123" << endl; }
}; // 类静态变量初始化
MyCAS* MyCAS::m_instance = NULL; // 线程入口函数
void myThread()
{
cout << "线程开始执行" << endl;
MyCAS* p = MyCAS::GetInstance();
cout << "线程结束执行" << endl;
} int main()
{
// 创建对象,但会对象指针
std::thread t1(myThread);
std::thread t2(myThread); t1.join();
t2.join(); return 0;
}

std::thread 六:多线程&单例类的更多相关文章

  1. Java线程和多线程(五)——单例类中的线程安全

    单例模式是最广泛使用的创建模式之一.在现实世界之中,诸如Databae的连接或者是企业信息系统(EIS)等,通常其创建都是受到限制的,应该尽量复用已存在对象而不是频繁创建销毁.为了达到这个目的,开发者 ...

  2. c++:自己动手实现线程安全的c++单例类

    前段时间使用c++做项目开发,需要根据根据配置文件路径加载全局配置文件,并对外提供唯一访问点.面对这样一个需求,自然的就想到了使用单例模式来创建一个单例配置对象,供外部调用.一开始想使用boost中自 ...

  3. C++11 单例类实现

    单例类: (1) 单例类保证全局只有一个唯一的实例对象. (2) 单例类保证只有唯一的接口获取这唯一实例. 非线程安全的单例类举例: class CSingleton { public: ~CSing ...

  4. iOS中编写单例类的心得

    单例 1.认识过的单例类有哪些: NSUserDefaults.NSNotificationCenter.NSFileManager.UIApplication 2.单例类 单例类某个类在代码编写时使 ...

  5. (七)boost库之单例类

    (七)boost库之单例类 一.boost.serialzation的单件实现 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一 ...

  6. 28.C++- 单例类模板(详解)

    单例类 描述 指在整个系统生命期中,一个类最多只能有一个实例(instance)存在,使得该实例的唯一性(实例是指一个对象指针)  , 比如:统计在线人数 在单例类里,又分为了懒汉式和饿汉式,它们的区 ...

  7. 游戏设计模式——C++单例类

    前言: 本文将探讨单例类设计模式,单例类的懒汉模式/饿汉模式,单例类的多线程安全性,最后将利用C++模板减少单例类代码量. 本文假设有一个Manager管理类,并以此为探究单例类的设计模式. 懒汉模式 ...

  8. muduo网络库源码学习————线程本地单例类封装

    muduo库中线程本地单例类封装代码是ThreadLocalSingleton.h 如下所示: //线程本地单例类封装 // Use of this source code is governed b ...

  9. Java单例类的简单实现

    对于java新手来说,单例类给我的印象挺深,之前一道web后台笔试题就是写单例类.*.*可惜当时不了解. 在大部分时候,我们将类的构造器定义成public访问权限,允许任何类自由创建该类的对象.但在某 ...

  10. JAVA之旅(六)——单例设计模式,继承extends,聚集关系,子父类变量关系,super,覆盖

    JAVA之旅(六)--单例设计模式,继承extends,聚集关系,子父类变量关系,super,覆盖 java也越来越深入了,大家加油吧!咱们一步步来 一.单例设计模式 什么是设计模式? JAVA当中有 ...

随机推荐

  1. 【Azure 环境】Azure 的PaaS服务如果涉及到安全漏洞问题后,我们如何确认所用服务的实例(VM:虚拟机)的操作系统已修复该补丁呢?

    问题描述 如上图中PaaS所不可见区域, 操作系统级别的内容我们并不知道具体的内容.如果当出现新的操作系统级别的安全漏洞时候,我们如何来确认当前所使用的Azure PaaS服务所在主机的OS已经修复了 ...

  2. 【Azure 微服务】Service Fabric 部署时遇见了VMExtensionProvisioningError错误: Multiple VM extensions failed to be provisioned on the VM

    问题描述 Deployment  Azure Service Fabric 时,遇见了VMExtensionProvisioningError, 全文如下: Deployment Name: 385A ...

  3. Java 可变个数形参的方法

    1 /** 2 * 3 * @Description 4 * @author Bytezero·zhenglei! Email:420498246@qq.com 5 * @version 6 * @d ...

  4. [.Net]使用Soa库+Abp搭建微服务项目框架(五):服务发现和健康监测

    ​上篇文章说过,服务发现和健康监测是面向服务体系架构重要的模块,Soa库可以配置使用Consul作为服务发现服务,或者轮询已配置的服务列表作为本机服务发现. 将用Hangfire来作为服务发现与健康监 ...

  5. vscode 提取扩展时出错 XHR failed

    vscode 提取扩展时出错 XHR failed 起因 vscode 安装 Bracket Pair Color DLW 插件,商店打不开了 解决方案 打开 hosts 添加 13.107.42.1 ...

  6. Windows逆向之配置虚拟机环境

    安装虚拟机环境 首先下载吾爱破解论坛专用版虚拟机软件VMWare Workstation 12,注册成功:再通过虚拟机启动论坛提供的WinXP系统镜像,在我的win11上完美运行. 实现文件互传 为了 ...

  7. 基于ADS1292芯片的解决方案之芯片简析

    基本资料: ADS1292芯片是多通道同步采样 24 位 Δ-Σ 模数转换器 (ADC),它们具有内置的可编程增益放大器 (PGA).内部基准和板载振荡器. ADS1292 包含 便携式 低功耗医疗心 ...

  8. 泰凌微TLSR825x智能照明解决方案开发之实例解析

    一 前记 前几天,看到了一个笑话,一个朋友在群里吼道,老婆送的皮带,用了半年之后,怎么里面掉出来一个电路板,这个是是啥? 笔者看了回复道,哥们,老婆不放心你啊. 在这个万物都可智能的时代,产品不加上智 ...

  9. 编译OpenWRT-for-MT7620A(带8021x验证)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  10. python基础八(迭代器、生成器、生成式、递归、匿名函数、面向过程编程)

    一 迭代器 1.什么是迭代器 迭代器指的是迭代取值的工具,迭代是一个重复的过程,每次重复都是基于上一次的结果而 继续的,单纯的重复并不是迭代2.为何要有迭代器 迭代器是用来迭代取值的工具,而涉及到把多 ...