C++ 线程安全的单例模式
来源:互联网 发布:网络直播歌手 编辑:程序博客网 时间:2024/05/29 01:52
废话不多说,常用的代码积淀下来。
一、懒汉模式:即第一次调用该类实例的时候才产生一个新的该类实例,并在以后仅返回此实例。
需要用锁,来保证其线程安全性:原因:多个线程可能进入判断是否已经存在实例的if语句,从而non thread safety.
使用double-check来保证thread safety.但是如果处理大量数据时,该锁才成为严重的性能瓶颈。
1、静态成员实例的懒汉模式:
Cpp代码
- class Singleton
- {
- private:
- static Singleton* m_instance;
- Singleton(){}
- public:
- static Singleton* getInstance();
- };
- Singleton* Singleton::getInstance()
- {
- if(NULL == m_instance)
- {
- Lock();//借用其它类来实现,如boost
- if(NULL == m_instance)
- {
- m_instance = new Singleton;
- }
- UnLock();
- }
- return m_instance;
- }
2、内部静态实例的懒汉模式
这里需要注意的是,C++0X以后,要求编译器保证内部静态变量的线程安全性,可以不加锁。但C++ 0X以前,仍需要加锁。
Cpp代码
- class SingletonInside
- {
- private:
- SingletonInside(){}
- public:
- static SingletonInside* getInstance()
- {
- Lock(); // not needed after C++0x
- static SingletonInside instance;
- UnLock(); // not needed after C++0x
- return instance;
- }
- };
二、饿汉模式:即无论是否调用该类的实例,在程序开始时就会产生一个该类的实例,并在以后仅返回此实例。
由静态初始化实例保证其线程安全性,WHY?因为静态实例初始化在程序开始时进入主函数之前就由主线程以单线程方式完成了初始化,不必担心多线程问题。
故在性能需求较高时,应使用这种模式,避免频繁的锁争夺。
Cpp代码
- class SingletonStatic
- {
- private:
- static const SingletonStatic* m_instance;
- SingletonStatic(){}
- public:
- static SingletonStatic* getInstance()
- {
- return m_instance;
- }
- };
- //外部初始化 before invoke main
- const SingletonStatic* SingletonStatic::m_instance = new SingletonStatic;
转载:http://tech.ddvip.com/2013-01/1358926708189443.html
- 设计模式 - 线程安全的单例模式(C#)
- object-c 单例模式的线程安全
- 线程安全单例模式(C++)
- 线程安全单例模式(C++)
- 线程安全的单例模式
- 线程安全的单例模式
- 线程安全的单例模式
- 线程安全的单例模式
- Volatile 线程安全的单例模式
- 线程安全的单例模式
- 基于线程安全的单例模式
- 线程安全的单例模式
- 单例模式的线程安全
- 线程安全的单例模式
- 线程安全的单例模式
- 线程安全的单例模式
- 线程安全的单例模式
- 线程安全的单例模式
- WIFI模块工作模式浅析
- 【事件冲突】ScrollView嵌套ViewPager冲突的解决办法
- 游戏更新-五子连珠-Android
- 【工作心得】部分工作总结
- Unix网络编程中的的五种I/O模型
- C++ 线程安全的单例模式
- oracle错误代码整理
- java中的堆和栈
- AIX配NIS服务
- 《DW2.0---下一代数据仓库的架构》读书笔记
- NSString
- 文档操作库DevExpress Document Server试用心得
- 进程控制块PCB结构 task_struct 描述
- mysql批量操作优化