C++线程安全单例模式详解:懒汉与饿汉模式对比
版权申诉
196 浏览量
更新于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-12-22 上传
2018-07-05 上传
点击了解资源详情
2021-01-20 上传
2020-08-30 上传
2020-08-29 上传
2020-12-16 上传
2020-08-29 上传
weixin_38691256
- 粉丝: 3
- 资源: 945
最新资源
- TFlow:基于计算机视觉的自动交通流量和密度估算
- Laravel开发-sentryuser .zip
- apg-js2:不推荐使用。 请使用更新的版本apg-js。 JavaScript APG 2.0版。 APG是ABNF解析器生成器。 它从ABNF语法的超集生成递归下降解析器
- weixin056微信小程序的购物系统+php(源码+部署说明+演示视频+源码介绍+lw).rar
- the-player:音频播放器。 无缝,完美
- 基于HTML实现的棕色美容养生会所企业网站模板5275(css+html+js+图样+毕业设计).zip
- Popular_Movies_Stage_1
- 创业计划书-湖南省决赛答辩规则
- 鼠标悬停hover样式,简洁漂亮的css3鼠标悬停鼠标悬停hover样式边框和爱心点赞特效
- React Native Spring ScrollView V2是一个用于React Native的高性能跨平台原生ScrollView滚动。(iOS和Android)-JavaScript开发
- matlab开发-IMF轴承故障诊断.zip
- brackets-codemirror-go:支持 Go 从 CodeMirror 到 Brackets 的扩展
- OnTimeAttendance:WebApp版本
- weixin080培训咨询微信小程序+ssm(源码+部署说明+演示视频+源码介绍+lw).rar
- 施工管理资料表格-F0401_通风空调隐蔽工程检查记录
- 基于HTML实现的免费宽屏响应式html5模板4890(含HTML源代码+使用说明+毕业设计).zip