C++实现多线程安全的单体模式(Singleton)
来源:互联网 发布:云视通电脑版mac怎么用 编辑:程序博客网 时间:2024/06/09 20:01
单体模式算是最简单的设计模式,不考虑多线程,我们可能会写出这样的代码:
class Singleton{public:static Singleton* getInstance();protected:Singleton(){};~Singleton(){};private:static Singleton* Instance;};Singleton* Singleton::Instance = 0;Singleton* Singleton::getInstance(){if(Instance == 0) //position 1Instance = new Singleton();return Instance;}
这段代码在单线程的情况下工作的足够好,但是在多线程下则是不安全的。比如同时有两个线程执行到position 1这个位置,那程序就悲剧了。
网上有多个版本的多线程安全的单体模式,而且有些版本的说两次检查类型的也是不安全的,但是个人测试是可以的,代码如下:
#ifndef SINGLE_H#define SINGLE_H#include <Windows.h>#include <iostream>using namespace std;CRITICAL_SECTION m_Section;class Locker{public:Locker(){InitializeCriticalSection(&m_Section);}~Locker(){}void Lock(){EnterCriticalSection(&m_Section);}void UnLock(){LeaveCriticalSection(&m_Section);}};Locker Lock;class Singleton{public:static Singleton* getInstance();protected:Singleton();~Singleton(){};private:static Singleton* Instance;static HANDLE m_hMutex;};Singleton* Singleton::Instance = 0;HANDLE Singleton::m_hMutex = 0;Singleton::Singleton(){m_hMutex = CreateMutexEx(NULL,NULL,0,0);cout<<"Constructor function."<<endl;}Singleton* Singleton::getInstance(){if(Instance == 0){Lock.Lock();if(Instance == 0){Instance = new Singleton();}Lock.UnLock();}return Instance;}#endif凑合能用。
还有很多关于多线程安全的Singleton,以后有时间再慢慢细看。
- C++实现多线程安全的单体模式(Singleton)
- C#.net Singleton 单体模式
- 多线程安全的Singleton单件模式在C++,java与C#下的实现
- singleton 模式的多线程安全创建
- 单体模式(Singleton)
- 单体模式 Singleton
- java singleton 单体模式
- 单体模式Singleton
- 单体模式singleton
- 单体模式Singleton
- 单例/单体模式(Singleton)
- 单例/单体模式(Singleton)
- 单例/单体模式(Singleton)
- 单例/单体模式(Singleton)
- 单例/单体模式(Singleton)
- 单例/单体模式(Singleton)
- Singleton的安全实现!
- 基于double lock的多线程安全的Singleton实现要点
- Java程序员必知的8大排序
- LVS-DR负载均衡-03
- Java实现的几个常用排序算法详细解读
- 安装bashell on AIX 5.3
- 第十章 关联容器
- C++实现多线程安全的单体模式(Singleton)
- C++STL概览
- 数据库三范式
- os的进程调度(读书笔记)
- 查询时间SQL
- 创建二次几何体的学习笔记
- 优先级反转问题
- 数据结构1
- 后悔本科没学的东西