C++线程安全单例模式详解:懒汉与饿汉模式对比
版权申诉
56 浏览量
更新于2024-09-12
收藏 67KB PDF 举报
本文将深入探讨C++中实现线程安全的单例模式,一种常见的设计模式,确保在一个应用程序中只有一个类实例。主要关注的是饿汉模式、懒汉模式以及如何在多线程环境下保证线程安全。
首先,我们介绍饿汉模式。这是一种在编译时就创建单例对象的方式。在模板类`singleton`中,静态成员变量`m_instance`在类声明时就被初始化为一个该类型的null指针。实例化`m_instance`时会自动调用构造函数,由于是在编译时完成的,所以不存在并发问题,因此饿汉模式是线程安全的,示例代码如下:
```cpp
template <typename T>
class singleton
{
public:
static T* GetInstance()
{
return m_instance;
}
private:
singleton() {}
singleton(const singleton&) = delete; // 防止拷贝构造
singleton& operator=(const singleton&) = delete; // 防止赋值
static T* m_instance;
};
template <typename T>
T* singleton<T>::m_instance = new T(); // 实例化时立即构造
```
然而,懒汉模式则是另一种策略,它推迟实例化到第一次请求时才执行。这通常会导致在多线程环境中出现并发问题,因为多个线程可能同时判断并创建实例,导致多个实例的创建。为了使懒汉模式线程安全,可以采用互斥锁(如`std::mutex`)来同步访问。改进后的代码示例如下:
```cpp
template <typename T>
class singleton
{
private:
mutable std::mutex mtx; // 使用互斥锁
T* m_instance = nullptr;
public:
static T* GetInstance()
{
std::lock_guard<std::mutex> lock(mtx); // 获取锁后执行
if (m_instance == nullptr)
{
m_instance = new T();
}
return m_instance;
}
};
```
这里,`std::lock_guard`会确保在获取到锁后执行初始化,如果在获取锁的过程中有其他线程尝试进入,会阻塞直到获取锁成功。这样就保证了在任何时刻只有一个线程实例化对象,实现了线程安全。
总结,C++中的单例模式有两种常见形式:饿汉模式和懒汉模式。饿汉模式是线程安全的,因为它在编译时就完成了实例化;而懒汉模式在多线程环境中需要通过互斥锁来保证线程安全。理解并正确使用这些模式,可以帮助开发人员设计出高效且可维护的多线程程序。
点击了解资源详情
点击了解资源详情
点击了解资源详情
2020-08-31 上传
2020-08-30 上传
2020-08-29 上传
2020-12-16 上传
2020-08-29 上传
2013-05-25 上传
weixin_38691256
- 粉丝: 3
- 资源: 945
最新资源
- fullcalendar-scheduler:FullCalendar附加组件,用于显示事件和资源
- hastscript:创建草木的实用程序
- Excel模板学生成绩统计表含图表.zip
- PushingWinJSForward:展示 WinJS Contrib 功能,突破 WinJS 的极限
- 【地产资料】3房地产教育培训.zip
- innersource
- Book-Recommend-Github:推荐生活当中积累的优秀Objective-C和Swift三方库
- PropertyAnimation
- sails-backbone-client:在浏览器中加载 Sails Backbone API
- 毕业设计&课设--毕业设计源码-基于Spark的Kmeans聚类算法优化.zip
- Excel模板财务报表收支表日记账.zip
- fuzzy-sys:交互使用systemctl的实用工具
- 净水阶段
- APPG-scrape:APPG清单的刮板
- movie-picker
- hinahina.com