多线程安全单例模式学习代码 c++11
// 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的更多相关文章
- java多线程与单例模式(Singleton)不得不说的故事
转发自:http://blog.csdn.net/ligang7560/article/details/50890282 单例模式的多种实现方式 我们都知道单例模式有几种常用的写法: - 饿汉模式 - ...
- pthread多线程编程的学习小结
pthread多线程编程的学习小结 pthread 同步3种方法: 1 mutex 2 条件变量 3 读写锁:支持多个线程同时读,或者一个线程写 程序员必上的开发者服务平台 —— DevSt ...
- iOS开发多线程篇—单例模式(ARC)
iOS开发多线程篇—单例模式(ARC) 一.简单说明: 设计模式:多年软件开发,总结出来的一套经验.方法和工具 java中有23种设计模式,在ios中最常用的是单例模式和代理模式. 二.单例模式说明 ...
- JAVA_多线程_单例模式
这篇是入职之后的第二篇了,上一篇我简单介绍了一下LOCK里面的类的方法,感兴趣的话可以去了解一下,以后坚持每周至少会更新一篇关于多线程方面的文章,希望博友们可以一起加油成长. 这篇主要的内容是单例模式 ...
- [深入学习Web安全](11)之XSS玩法
[深入学习Web安全](11)之XSS玩法 本文转自:i春秋社区 前言这篇paper,我们将学习如何优雅的调戏XSS.我们会教大家一些不常用的,但很实用的XSS姿势.我们在正式进入主题之前,先来说一下 ...
- 20155321 《信息安全系统设计》Linux多线程的深入学习
再次学习之多线程 基本概念的再次学习 线程是程序执行的最小单位(进程是资源管理的最小单位),线程隶属于某个进程中 进程有自己的数据段.代码段和堆栈段.线程通常叫做轻型的进程,每个线程共享其所附属进程的 ...
- SpringBoot学习笔记(11):使用WebSocket构建交互式Web应用程序
SpringBoot学习笔记(11):使用WebSocket构建交互式Web应用程序 快速开始 本指南将引导您完成创建“hello world”应用程序的过程,该应用程序在浏览器和服务器之间来回发送消 ...
- Flutter学习笔记(11)--文本组件、图标及按钮组件
如需转载,请注明出处:Flutter学习笔记(10)--容器组件.图片组件 文本组件 文本组件(text)负责显示文本和定义显示样式,下表为text常见属性 Text组件属性及描述 属性名 类型 默认 ...
- clone的fork与pthread_create创建线程有何不同&pthread多线程编程的学习小结(转)
进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合,这些资源在Linux中被抽 象成各种数据对象:进程控制块.虚存空间.文件系统,文件I/O.信号处理函数.所以创建一个进程的 过程就是这 ...
随机推荐
- Java遍历Map对象的方式
public static void main(String[] args) { HashMap<String, String> testMap = new HashMap<> ...
- 双心一键获取winsxs的写入权限,解决VC运行库安装error1935错误
@Echo offtitle 双心一键获取winsxs的写入权限,解决VC运行库安装error1935等错误set path=%path%;%~dp0setlocal EnableDelayedExp ...
- Webservices部署在IIS6.0上的一个小问题
部署方式还是跟网站的部署方式一样,可是通过localhost访问一直提示400(bad request)错误. 可以在iis上预览到.在vs上引用的时候怎么都预览不到. 换个思路,把localhost ...
- js中slice方法(转)
1.String.slice(start,end)returns a string containing a slice, or substring, of string. It does not m ...
- springboot整合mybatis之注解方式
1. 创建maven项目,工程目录如下图 2. 在pom.xml文件中添加mybatis依赖. 3. 创建实体类,并生成construct方法,getter和setter方法.同时在数据库中创建对应的 ...
- python-web自动化-三种等待方式
当有元素定位不到时,比如下拉框,弹出框等各种定位不到时:一般是两种问题:1 .有frame :2.没有加等待 下面学习三种等待方式: 1.强制等待 sleep(xx)这种方法简单粗暴,不管浏览器是否加 ...
- Error during artifact deployment. See server log for details.
Error during artifact deployment. See server log for details. 这两个地方要一样.不然.就报 Error during artifact d ...
- oracle用户的管理
用户登陆 sql>conn 用户名/密码 给用户修改密码 如果给自己修改密码可以直接使用 sql>password 用户名; 如果给别人修改密码则需要具有dba的权限,或是拥有alter ...
- python杂记一
1. 输出CSV文件 用python输出csv文件不难,可是MS office excel和WPS 对输出的CSV文件打开规则不一样. WPS可以支持CSV以'\t'为分隔符,打开文件直接写内容 MS ...
- 【原】The Linux Command Line - Workiing with commands
● type – Indicate how a command name is interpreted● which – Display which executable program will b ...