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当中有 ...
随机推荐
- 第123篇: JS函数属性与方法
好家伙,本篇为<JS高级程序设计>第十章"函数"学习笔记 ECMAScript 中的函数是对象,因此有属性和方法. 1.函数属性 每个函数都有两个属性:length 和 ...
- WPF性能优化:性能分析工具
在硬件性能不断提升的现在,软件性能依旧是开发人员关注的重点.不同类型的程序关注的具体性能指标有所不同,服务器程序注重吞吐量,游戏引擎追求渲染效率,桌面程序则关注内存消耗以及界面加载效率和流畅性.当我们 ...
- 机器学习策略篇:详解满足和优化指标(Satisficing and optimizing metrics)
满足和优化指标 要把顾及到的所有事情组合成单实数评估指标有时并不容易,在那些情况里,发现有时候设立满足和优化指标是很重要的,让我告诉是什么意思吧. 假设已经决定很看重猫分类器的分类准确度,这可以是\( ...
- 你不得不知道的 MySQL 优化原理
目录 MySQL逻辑架构 MySQL查询过程 客户端/服务端通信协议 查询缓存 查询优化 查询执行引擎 返回结果给客户端 总结 性能优化建议 Scheme设计与数据类型优化 创建高性能索引 索引相关的 ...
- 【Azure Key Vault】使用Azure CLI获取Key Vault 机密遇见问题后使用curl命令来获取机密内容
问题描述 在使用Azure Key Vault的过程中,遇见无法获取机密信息,在不方便直接写代码的情况下,快速使用Azure CLI指令来验证当前使用的认证是否可以获取到正确的机密值. 使用CLI的指 ...
- 二: sql模式(sql_mode)
# sql_mode 1 介绍 sql_mode 会影响 MySQL支持的SQL语法以及它执行的数据验证检查.通过设置sql_mode,可以完成不同严格程度 的数据校验,有效地保障数据准确性. MyS ...
- hadoop集群环境搭建--双NameNode
hadoop配置文件修改 个人配置文件压缩包地址: hadoop配置文件压缩包地址点此下载 tar -zxvf 你的压缩包路径/hadoop.tar.gz -C /usr/hadoop(你的hadoo ...
- 8、mysql的内存管理及优化
内存优化原则 1) 将尽量多的内存分配给MySQL做缓存,但要给操作系统和其他程序预留足够内存. 2) MyISAM 存储引擎的数据文件读取依赖于操作系统自身的IO缓存,因此,如果有MyISAM表,就 ...
- 从零开始写 Docker(五)---基于 overlayfs 实现写操作隔离
本文为从零开始写 Docker 系列第五篇,在 pivotRoot 基础上通过 overlayfs 实现写操作隔离,达到容器中写操作和宿主机互不影响. 完整代码见:https://github.com ...
- 移远4G数传模块EC800M开发总结之基本备忘
一 前记 1 EC800M模块是移远推出的小尺寸低功耗针对可穿戴市场的数传产品.笔者在几个产品上使用过程中,遇到了一些问题. 这里做个备忘吧. 二 梳理 1 工具,这个串口的默认波特率为115200. ...