C++单例模式(懒汉和饿汉)与线程安全
2023-09-27 14:27:45 时间
1. 饿汉模式
#include<iostream> class singleton { private: static singleton* p; singleton(){} public: static singleton* getInstance() { return p; } }; singleton* singleton::p = new singleton(); int main() { singleton* p = singleton::getInstance(); singleton* p2= singleton::getInstance(); std::cout << p << std::endl; std::cout << p << std::endl; }
这是一个线程安全的实现方法,因为singleton::p在进入main函数之前就由单线程方式实例化,这也就是饿汉模式。相比之下懒汉模式就是第一次使用到类实例的时候才创建。
2. 懒汉模式
class singleton { private: static singleton* p; singleton(){} public: static singleton* getInstance() { if(p == NULL) { p = new singleton(); std::cout << "once" << std::endl; } else std::cout << "not once" << std::endl; return p; } }; singleton* singleton::p = NULL;
3. 懒汉的线程安全问题
在多线程中,可能有多个线程同时判断p==NULL为真,所以需要加锁。
class singleton { private: static singleton* p; static pthread_mutex_t mutex; singleton(){} public: static singleton* getInstance() { pthread_mutex_lock(&mutex); if(p == NULL) { p = new singleton(); } pthread_mutex_unlock(&mutex); return p; } }; pthread_mutex_t singleton::mutex = PTHREAD_MUTEX_INITIALIZER; singleton* singleton::p = NULL;
因为加锁是一个耗时的操作,其实只有在第一次创建实例的时候需要加锁,所以可以做一个优化:
class singleton { private: static singleton* p; static pthread_mutex_t mutex; singleton(){} public: static singleton* getInstance() { if(p == NULL) { pthread_mutex_lock(&mutex); if(p == NULL) { p = new singleton(); } pthread_mutex_unlock(&mutex); } return p; } }; pthread_mutex_t singleton::mutex = PTHREAD_MUTEX_INITIALIZER; singleton* singleton::p = NULL;
参考链接:https://blog.csdn.net/hj605635529/article/details/70172842
相关文章
- 【C/C++开发】C++实现字符串替换的两种方法
- 【C/C++】对于可重入、线程安全、异步信号安全几个概念的理解
- 【C/C++】什么是类型安全
- C++:结构体【C++的结构体有①构造函数、②析构函数;C没有】【C++的结构体就是类】【struct变量放栈上(自动释放),class变量放堆上(手动释放)】【结构体默认公共,类默认私有】
- C++:CMake概述【比MakeFile高级的编译器(Level-2)】【跨平台、开源的构建系统】【跨平台编译工具,比make更为高级,使用起来更方便】【CMakeLists.txt】
- C++的ORM 开源框架
- C++中变量类型及存储类型
- c++ JSON class:Value、Reader、Writer。jsoncpp
- C++ String (例题:洛谷P1032 字串变换)
- 基于C++的冒泡排序法
- C++编写安全OCX,IE不弹出安全提示
- 【C++ JSON 开源库】nlohmann入门使用总结
- RCF:一个相当不错的C++分布式RPC框架
- C++11 lambda表达式(19篇C++11文章)
- C++多线程编程(三)线程间通信
- C/C++/Linux「学习必备」珍藏多年的学习网站分享 | 工欲善其事必先利其器
- C++:单例模式——线程安全模式、饥汉模式、懒汉模式
- Visual C++ for Linux Development