// 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. 【python】Numpy中stack(),hstack(),vstack()函数详解

    转自 https://blog.csdn.net/csdn15698845876/article/details/73380803 这三个函数有些相似性,都是堆叠数组,里面最难理解的应该就是stack ...

  2. ionic3安卓平台引用高德地图

    1.前置条件 第一步,注册高德开发者:第二步,去控制台创建应用:第三步,获取Key. 2.打开src目录下的index.html, 在head标签中添加以下代码,引入js: <script ty ...

  3. 对pytorch中Tensor的剖析

    不是python层面Tensor的剖析,是C层面的剖析. 看pytorch下lib库中的TH好一阵子了,TH也是torch7下面的一个重要的库. 可以在torch的github上看到相关文档.看了半天 ...

  4. ssh免密钥之上厕所

    ssh服务简单介绍 SSH协议框架中最主要的部分是三个协议: *传输层协议(The Transport Layer Protocol)提供服务器认证,数据机密性,信息完整性等的支持; *用户认证协议( ...

  5. Excel宏录制、数据透视表、合并多个页签

    前段时间做数据分析的时候,遇到很多报表文件需要处理,在此期间学习了很多Excel操作,特此做笔记回顾. Excel宏录制 打开开发者工具 打开Excel文件,选择”文件”-->“选项”--> ...

  6. 03-封装BeanUtil工具类(javabean转map和map转javabean对象)

    package com.oa.test; import java.beans.BeanInfo; import java.beans.IntrospectionException; import ja ...

  7. Docker系列08:容器监控

    1 监控解决方案 cadvisor+influxdb+grafana cAdvisor:Google开源的工具,用于监控Docker主机和容器系统资源,通过图形页面实时显示数据,但不存储:它通过宿主机 ...

  8. mysql 拒绝登录解决

    一大早打开Navicat Lite for MySQL客户端,提示1045 access denied for user ’root’@’localhost’ using password yes,太 ...

  9. Android控件使用FragmentTabHost,切换Fragment;

    大部分APP的主界面都很类似,要么底部导航的,要么就是侧滑菜单,还有底部导航+侧滑菜单的:底部导航实现大概有几种方式: TabHost+Fragment RadioGroup+Fragment Fra ...

  10. 195. Spring Boot 2.0数据库迁移:Flyway

    [视频&交流平台] àSpringBoot视频:http://t.cn/R3QepWG à SpringCloud视频:http://t.cn/R3QeRZc à Spring Boot源码: ...