C++实现一个线程安全且高效单例类
2017-07-29 16:31
489 查看
转载自:http://www.cnblogs.com/qiaoconglovelife/p/5851163.html
C++实现一个线程安全且高效单例类
1 单例模式
我们都很清楚一个简单的单例模式该怎样去实现:构造函数声明为private或protect防止被外部函数实例化,内部保存一个private static的类指针保存唯一的实例,实例的动作由一个public的类方法代劳,该方法也返回单例类唯一的实例。上代码:
2 懒汉与饿汉
单例大约有两种实现方法:懒汉与饿汉。懒汉:故名思义,不到万不得已就不会去实例化类,也就是说在第一次用到类实例的时候才会去实例化,所以上边的经典方法被归为懒汉实现;
饿汉:饿了肯定要饥不择食。所以在单例类定义的时候就进行实例化。
特点与选择:
由于要进行线程同步,所以在访问量比较大,或者可能访问的线程比较多时,采用饿汉实现,可以实现更好的性能。这是以空间换时间。
在访问量较小时,采用懒汉实现。这是以时间换空间。
3 线程安全的懒汉实现
线程不安全,怎么办呢?最直观的方法:加锁。方法1:加锁的经典懒汉实现:
class singleton { protected: singleton() { pthread_mutex_init(&mutex); } private: static singleton* p; public: static pthread_mutex_t mutex; static singleton* initance(); }; pthread_mutex_t singleton::mutex; singleton* singleton::p = NULL; singleton* singleton::initance() { if (p == NULL) { pthread_mutex_lock(&mutex); if (p == NULL) p = new singleton(); pthread_mutex_unlock(&mutex); } return p; }
方法2:内部静态变量的懒汉实现
此方法也很容易实现,在instance函数里定义一个静态的实例,也可以保证拥有唯一实例,在返回时只需要返回其指针就可以了。推荐这种实现方法,真得非常简单。class singleton { protected: singleton() { pthread_mutex_init(&mutex); } public: static pthread_mutex_t mutex; static singleton* initance(); int a; }; pthread_mutex_t singleton::mutex; singleton* singleton::initance() { pthread_mutex_lock(&mutex); static singleton obj; pthread_mutex_unlock(&mutex); return &obj; }
4 饿汉实现
为什么我不讲“线程安全的饿汉实现”?因为饿汉实现本来就是线程安全的,不用加锁。为啥?自己想!相关文章推荐
- C++实现一个线程安全且高效单例类。(懒汉与饿汉)
- 如何使用Future和ConcurrentHashMap实现一个线程安全且高效的缓存
- 二叉搜索树转换成一个排序的双向链表和实现一个线程安全且高效单例类——题集(二十一)
- C++实现一个线程安全的单例工厂实现代码
- C++实现一个线程安全的单例工厂
- 【安卓-自定义布局】安卓App开发思路 一步一个脚印(十)实现内嵌在app中的webview 腾讯开源X5 高效安全
- 一个简单的Java对象池实现——可用来解决SimpleDateFormat的线程安全问题
- 实现一个线程安全的单例模式
- 一个Windows C++的线程类实现
- C++实现一个简单的双线程MVC框架
- C++中一个高效的内存池实现
- 《C++中线程安全并且高效的singleton》
- 一个Windows C++的线程类实现
- C++实现线程同步的几种方式 线程同步是指同一进程中的多个线程互相协调工作从而达到一致性。之所以需要线程同步,是因为多个线程同时对一个数据对象进行修改操作时,可能会对数据造成破坏,下面是多
- C++中线程安全并且高效的singleton
- C++实现的可以安全的暂停、继续、停止线程的封装类
- 用PHP实现一个高效安全的ftp服务器(一)
- 这里实现一个基于数组的线程安全的循环队列
- C++ 非多线程安全实现Stream Part 1
- 实现一个线程安全的内存池(使用线程私有数据机制TSD来实现)