std::thread 六:多线程&单例类
为了避免单例类在多线程中重复的创建,下面提供了两种解决方法:
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 六:多线程&单例类的更多相关文章
- Java线程和多线程(五)——单例类中的线程安全
单例模式是最广泛使用的创建模式之一.在现实世界之中,诸如Databae的连接或者是企业信息系统(EIS)等,通常其创建都是受到限制的,应该尽量复用已存在对象而不是频繁创建销毁.为了达到这个目的,开发者 ...
- c++:自己动手实现线程安全的c++单例类
前段时间使用c++做项目开发,需要根据根据配置文件路径加载全局配置文件,并对外提供唯一访问点.面对这样一个需求,自然的就想到了使用单例模式来创建一个单例配置对象,供外部调用.一开始想使用boost中自 ...
- C++11 单例类实现
单例类: (1) 单例类保证全局只有一个唯一的实例对象. (2) 单例类保证只有唯一的接口获取这唯一实例. 非线程安全的单例类举例: class CSingleton { public: ~CSing ...
- iOS中编写单例类的心得
单例 1.认识过的单例类有哪些: NSUserDefaults.NSNotificationCenter.NSFileManager.UIApplication 2.单例类 单例类某个类在代码编写时使 ...
- (七)boost库之单例类
(七)boost库之单例类 一.boost.serialzation的单件实现 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一 ...
- 28.C++- 单例类模板(详解)
单例类 描述 指在整个系统生命期中,一个类最多只能有一个实例(instance)存在,使得该实例的唯一性(实例是指一个对象指针) , 比如:统计在线人数 在单例类里,又分为了懒汉式和饿汉式,它们的区 ...
- 游戏设计模式——C++单例类
前言: 本文将探讨单例类设计模式,单例类的懒汉模式/饿汉模式,单例类的多线程安全性,最后将利用C++模板减少单例类代码量. 本文假设有一个Manager管理类,并以此为探究单例类的设计模式. 懒汉模式 ...
- muduo网络库源码学习————线程本地单例类封装
muduo库中线程本地单例类封装代码是ThreadLocalSingleton.h 如下所示: //线程本地单例类封装 // Use of this source code is governed b ...
- Java单例类的简单实现
对于java新手来说,单例类给我的印象挺深,之前一道web后台笔试题就是写单例类.*.*可惜当时不了解. 在大部分时候,我们将类的构造器定义成public访问权限,允许任何类自由创建该类的对象.但在某 ...
- JAVA之旅(六)——单例设计模式,继承extends,聚集关系,子父类变量关系,super,覆盖
JAVA之旅(六)--单例设计模式,继承extends,聚集关系,子父类变量关系,super,覆盖 java也越来越深入了,大家加油吧!咱们一步步来 一.单例设计模式 什么是设计模式? JAVA当中有 ...
随机推荐
- 论文《Attention is all you need》阅读笔记
Attention is all you need Transformer模型 Model Architecture Transformer结构上和传统的翻译模型相同,拥有encoder-decode ...
- 微信小程序测试点,9大方面全方位总结
微信小程序无需下载安装,用户在微信扫一扫或搜索即可使用,小程序版本类型可分为:开发版.体验版.正式版. 开发版.体验版无需审核,只需要给微信号权限,经过扫小程序的二维码就能访问,正式版本需要经过微信审 ...
- 修改html5 placeholder文字默认颜色
注意: 1.input后面的冒号不要写错! 2.-moz后面是没有input字样,火狐设置字体颜色为#000,但是他不是全黑,好像有个度似的!(个人认为) input:-ms-input-placeh ...
- AtCoder Beginner Contest 338(A~E补题)
目录 A B C题 D题 E题 A 签到 #include <bits/stdc++.h> #define rep(i,a,b) for(int i = (a); i <= (b); ...
- Thinkphp6 自定义命令创建类文件
以创建控制器为例 1.先通过 think 命令创建一个make文件,效果如下图: php think make:command make/MyController 2.修改上面创建的文件[MyCont ...
- 阿里二面:如何定位&避免死锁?连着两个面试问到了!
在面试过程中,死锁是必问的知识点,当然死锁也是我们日常开发中也会遇到的一个问题,同时一些业务场景例如库存扣减,银行转账等都需要去考虑如何避免死锁,一旦线上发生了死锁,那可能年终不保.....下面我们就 ...
- 重新定义 vscode 命令行工具 code命令 code $profile
vscode 默认命令行有问题 他那个每次都打开cli.js 目录名里面有空格 要 &开头后面跟双引号 所以从新定义后 变量是 $变量名 前面再加上& 就能调用那个exe了 后面再跟上 ...
- Editor - Goto Location: Multiple Definitions - vscode 多个定义,直接跳转到主定义 不进行选择
Editor - Goto Location: Multiple Definitions - vscode 多个定义,直接跳转到主定义 不进行选择 配置里面 搜 多
- 32位数字电位器AD5228使用及调试总结
一 概念 什么是数字电位计? 数字电位器(Digital Potentiometer)亦称数控可编程电阻器,是一种代替传统机械电位器(模拟电位器)的新型CMOS数字.模拟混合信号处理的集成电路.数字电 ...
- 微型MPU6050模块及串口/BLE透传的实物展示
前言 随着时间的积累,项目的沉淀.把很多做过的产品标准化掉,形成可以立即拿出来使用的产品.是非常重要的一个环节.最近,把基于MPU6050的模块微型化并使用串口透传这个产品梳理了一下.形成了标准化 ...