C++实现多线程安全的单体模式(Singleton)
2012-09-19 22:54
447 查看
单体模式算是最简单的设计模式,不考虑多线程,我们可能会写出这样的代码:
这段代码在单线程的情况下工作的足够好,但是在多线程下则是不安全的。比如同时有两个线程执行到position 1这个位置,那程序就悲剧了。
网上有多个版本的多线程安全的单体模式,而且有些版本的说两次检查类型的也是不安全的,但是个人测试是可以的,代码如下:
还有很多关于多线程安全的Singleton,以后有时间再慢慢细看。
class Singleton { public: static Singleton* getInstance(); protected: Singleton(){}; ~Singleton(){}; private: static Singleton* Instance; }; Singleton* Singleton::Instance = 0; Singleton* Singleton::getInstance() { if(Instance == 0) //position 1 Instance = 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++实现多线程安全的单例模式
- C++实现多线程安全的单例模式
- C++实现多线程安全的单例模式 已测试
- 多线程安全的Singleton单件模式在C++,java与C#下的实现
- 【转】单例模式 C++实现 多线程安全
- Singleton模式的C++实现研究(示例代码)
- 多线程单例模式的安全实现
- Singleton模式的C++实现研究(转贴)
- Singleton模式的C++实现研究(示例代码)
- 设计模式C++实现_1_Singleton设计模式(简单的实现)
- Singleton模式的C++实现研究
- C++完美实现Singleton模式
- singleton 模式的多线程安全创建
- Singleton模式的C++实现研究(示例代码)
- Singleton模式(C++实现)
- C++完美实现Singleton模式
- Singleton单例模式--C++实现
- Head First设计模式C++实现--第五章:单件(Singleton)模式
- C++实现设计模式: Singleton 单例模式
- c++--Singleton单例模式的实现