// Singleton.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <mutex>
#include <iostream>
#include <windows.h> using namespace std; /**************************************************************
技术博客
http://www.cnblogs.com/itdef/ 技术交流群
群号码:324164944 欢迎c c++ windows驱动爱好者 服务器程序员沟通交流
**************************************************************/ std::mutex gPrintMtx; // 多线程下 用于打印的互斥量
std::mutex gSingletonmtx; // Singleton类的互斥量
std::mutex gSamplemtx; // 示例类的互斥量 // 单例模式类 模板为实际单例类
template<typename T>
class Singleton {
public:
// 多线程下使用互斥量 注意死锁
Singleton() {
std::lock_guard<std::mutex> lck(gSingletonmtx);
count++;
if (p == NULL) {
p = new T();
}
std::lock_guard<std::mutex> lock(gPrintMtx);
//cout << "Singleton ..." << endl;
} T* GetInstance() {
return p;
}
~Singleton() {
// 使用计数来决定是否删除实际单例类
std::lock_guard<std::mutex> lck(gSingletonmtx);
count--;
if (p != NULL&&count == )
{
delete p;
p = NULL;
count = ;
std::lock_guard<std::mutex> lock(gPrintMtx);
cout << "~Singleton delete" << endl;
}
std::lock_guard<std::mutex> lock(gPrintMtx);
//cout << "~Singleton ..." << endl;
}
private:
static int count;
static T* p; }; template<typename T>
T* Singleton<T>::p = NULL; template<typename T>
int Singleton<T>::count = ; // 单例模式的示例类
class Sample {
public:
// 多线程下使用互斥量 注意死锁
Sample() {
std::lock_guard<std::mutex> lck(gSamplemtx);
std::lock_guard<std::mutex> lock(gPrintMtx);
count++; cout << "Sample..." << endl;
}
void GetCount(){
std::lock_guard<std::mutex> lck(gSamplemtx);
std::lock_guard<std::mutex> lock(gPrintMtx);
cout << "****Sample::cout = " << count << endl;
}
~Sample() {
std::lock_guard<std::mutex> lck(gSamplemtx);
std::lock_guard<std::mutex> lock(gPrintMtx);
cout << "~Sample..." << endl;
}
private:
static int count ;
}; int Sample::count = ; void ThreadFunc() {
// 多个Sample类 单例模式
Singleton<Sample> a;
Singleton<Sample> b;
Singleton<Sample> c; // 查看Sample类的计数 验证
a.GetInstance()->GetCount();
b.GetInstance()->GetCount();
c.GetInstance()->GetCount();
} int main()
{
const int threadCount = ; //线程数目 可更改
std::thread threads[threadCount]; // 多线程执行函数
for (int i = ; i < threadCount; i++)
{
threads[i] = std::thread(ThreadFunc);
} // join() 等待
for (auto& th : threads)
th.join(); return ;
}

运行显示:

Sample...
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
****Sample::cout = 1
~Sample...
~Singleton delete
请按任意键继续. . .

多线程安全单例模式学习代码 c++11的更多相关文章

  1. java多线程与单例模式(Singleton)不得不说的故事

    转发自:http://blog.csdn.net/ligang7560/article/details/50890282 单例模式的多种实现方式 我们都知道单例模式有几种常用的写法: - 饿汉模式 - ...

  2. pthread多线程编程的学习小结

    pthread多线程编程的学习小结  pthread 同步3种方法: 1 mutex 2 条件变量 3 读写锁:支持多个线程同时读,或者一个线程写     程序员必上的开发者服务平台 —— DevSt ...

  3. iOS开发多线程篇—单例模式(ARC)

    iOS开发多线程篇—单例模式(ARC) 一.简单说明: 设计模式:多年软件开发,总结出来的一套经验.方法和工具 java中有23种设计模式,在ios中最常用的是单例模式和代理模式. 二.单例模式说明 ...

  4. JAVA_多线程_单例模式

    这篇是入职之后的第二篇了,上一篇我简单介绍了一下LOCK里面的类的方法,感兴趣的话可以去了解一下,以后坚持每周至少会更新一篇关于多线程方面的文章,希望博友们可以一起加油成长. 这篇主要的内容是单例模式 ...

  5. [深入学习Web安全](11)之XSS玩法

    [深入学习Web安全](11)之XSS玩法 本文转自:i春秋社区 前言这篇paper,我们将学习如何优雅的调戏XSS.我们会教大家一些不常用的,但很实用的XSS姿势.我们在正式进入主题之前,先来说一下 ...

  6. 20155321 《信息安全系统设计》Linux多线程的深入学习

    再次学习之多线程 基本概念的再次学习 线程是程序执行的最小单位(进程是资源管理的最小单位),线程隶属于某个进程中 进程有自己的数据段.代码段和堆栈段.线程通常叫做轻型的进程,每个线程共享其所附属进程的 ...

  7. SpringBoot学习笔记(11):使用WebSocket构建交互式Web应用程序

    SpringBoot学习笔记(11):使用WebSocket构建交互式Web应用程序 快速开始 本指南将引导您完成创建“hello world”应用程序的过程,该应用程序在浏览器和服务器之间来回发送消 ...

  8. Flutter学习笔记(11)--文本组件、图标及按钮组件

    如需转载,请注明出处:Flutter学习笔记(10)--容器组件.图片组件 文本组件 文本组件(text)负责显示文本和定义显示样式,下表为text常见属性 Text组件属性及描述 属性名 类型 默认 ...

  9. clone的fork与pthread_create创建线程有何不同&pthread多线程编程的学习小结(转)

    进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合,这些资源在Linux中被抽 象成各种数据对象:进程控制块.虚存空间.文件系统,文件I/O.信号处理函数.所以创建一个进程的 过程就是这 ...

随机推荐

  1. putty安装和使用

    https://blog.csdn.net/l707941510/article/details/80520790

  2. kafuka资料学习

    http://blog.csdn.net/hmsiwtv/article/details/46960053

  3. Python撰写mail

    版本1   指定邮箱进行发送 """ 说明:指定账户密码进行邮件发送 由312051952@qq.com-->c4kaichen@163.com "&qu ...

  4. CSS存在形式的引用

    撰写个css文件 直接引用css文件样式的内容.本质是将css文件拿过来

  5. MySQL 大数据备份方案之Percona XtraBackup

    Xtrabackup介绍 1.Xtrabackup是什么 Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbacku ...

  6. wordpress评论回复自动发邮件的功能

    A.插件流,可以说WP强大的插件功能的确能省事不少. 插件的办法一般是两步:第一实现成功发邮件,第二时间评论自动回复,这就需要用到两个插件,一个是Configure SMTP,一个是Mail To C ...

  7. 记一次KUBERNETES/DOCKER网络排障

    https://coolshell.cn/articles/18654.html 总结在前面: 1.kill -9杀死docker进程,系统一定是要遍历所有的docker子进程来一个一个发退出信号的, ...

  8. 深入理解volatile

    volatile知识点 --------------------------------------------------------------------------- 1.volatile关键 ...

  9. nginx的一次工作记录

    upstream fazhi_ui{ server ; } upstream fazhi_api{ server ; } server { listen ; server_name localhost ...

  10. Linux下修改Tomcat默认端口

    假设tomcat所在目录为/usr/local/apache-tomcat/ 1.打开tomcat配置文件#vi /usr/local/apache-tomcat/conf/server.xml 2. ...