C++ 线程安全的单例模式
来源:互联网 发布:天涯明月刀iu捏脸数据 编辑:程序博客网 时间:2024/06/05 20:21
http://www.cnblogs.com/ccdev/archive/2012/12/19/2825355.html
看看这里http://www.jellythink.com/archives/82
废话不多说,常用的代码积淀下来。
一、懒汉模式:即第一次调用该类实例的时候才产生一个新的该类实例,并在以后仅返回此实例。
需要用锁,来保证其线程安全性:原因:多个线程可能进入判断是否已经存在实例的if语句,从而non thread safety.
使用double-check来保证thread safety.但是如果处理大量数据时,该锁才成为严重的性能瓶颈。
1、静态成员实例的懒汉模式:
1 class Singleton 2 { 3 private: 4 static Singleton* m_instance; 5 Singleton(){} 6 public: 7 static Singleton* getInstance(); 8 }; 9 10 Singleton* Singleton::getInstance()11 {12 if(NULL == m_instance)13 {14 Lock();//借用其它类来实现,如boost15 if(NULL == m_instance)16 {17 m_instance = new Singleton;18 }19 UnLock();20 }21 return m_instance;22 }
2、内部静态实例的懒汉模式
这里需要注意的是,C++0X以后,要求编译器保证内部静态变量的线程安全性,可以不加锁。但C++ 0X以前,仍需要加锁。
1 class SingletonInside 2 { 3 private: 4 SingletonInside(){} 5 public: 6 static SingletonInside* getInstance() 7 { 8 Lock(); // not needed after C++0x 9 static SingletonInside instance;10 UnLock(); // not needed after C++0x11 return instance; 12 }13 };
二、饿汉模式:即无论是否调用该类的实例,在程序开始时就会产生一个该类的实例,并在以后仅返回此实例。
由静态初始化实例保证其线程安全性,WHY?因为静态实例初始化在程序开始时进入主函数之前就由主线程以单线程方式完成了初始化,不必担心多线程问题。
故在性能需求较高时,应使用这种模式,避免频繁的锁争夺。
1 class SingletonStatic 2 { 3 private: 4 static const SingletonStatic* m_instance; 5 SingletonStatic(){} 6 public: 7 static SingletonStatic* getInstance() 8 { 9 return m_instance;10 }11 };12 13 //外部初始化 before invoke main14 const SingletonStatic* SingletonStatic::m_instance = new SingletonStatic;
0 0
- 设计模式 - 线程安全的单例模式(C#)
- object-c 单例模式的线程安全
- 线程安全单例模式(C++)
- 线程安全单例模式(C++)
- 线程安全的单例模式
- 线程安全的单例模式
- 线程安全的单例模式
- 线程安全的单例模式
- Volatile 线程安全的单例模式
- 线程安全的单例模式
- 基于线程安全的单例模式
- 线程安全的单例模式
- 单例模式的线程安全
- 线程安全的单例模式
- 线程安全的单例模式
- 线程安全的单例模式
- 线程安全的单例模式
- 线程安全的单例模式
- 第一周(程序阅读)——买车方案。
- Tomcat与Servlet之间的关系
- 快速排序算法实现
- 关于移位运算符的知识点
- 关于iOS自动布局
- C++ 线程安全的单例模式
- eclipse远程调试Tomcat, Hadoop集群等
- c++中的单例模式
- 11.累加器实验
- 线性代数(三十) :特征值与特征向量的性质
- Android学习之——JAVA中的Object
- 通过VMware克隆linux虚拟机后无法联网,eth0找不到的解决方案
- 黑马程序员_String
- IAR下载: Failed to get cpu status after 4 retrie 的解决方法