首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
SAAS
ToB门户
了解全球最新的ToB事件
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
微博
Follow
记录
Doing
博客
Blog
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
排行榜
Ranklist
相册
Album
应用中心
qidao123.com ToB IT社区-企服评测·应用市场
»
论坛
›
大数据
›
数据仓库与分析
›
C++单例模式
返回列表
发新帖
C++单例模式
[复制链接]
发表于 2026-1-25 08:43:56
|
显示全部楼层
|
阅读模式
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
×
局部静态变量方式
//通过静态成员变量实现单例
//懒汉式
class Single2
{
private:
Single2()
{
}
Single2(const Single2 &) = delete;
Single2 &operator=(const Single2 &) = delete;
public:
static Single2 &GetInst()
{
static Single2 single;
return single;
}
};
复制
代码
一个经典的懒汉式单例模式实现,通过静态成员变量来确保 Single2 类只有一个实例。这个实现是准确的,但有几点必要留意:
线程
安全
性
:在C++11及更高
版本
中,局部静态变量(如 GetInst 方法中的 static Single2 single)的初始化是线程
安全
的。因此,这个实现是线程
安全
的,不会在多线程环境中引发标题。
构造函数和赋值运算符的删除
:你通过 delete 删除了拷贝构造函数和赋值运算符,这可以防止在外部创建类的拷贝或通过赋值创建多个实例,这是单例模式的准确做法。
懒汉式单例的使用
:懒汉式单例在初次调用 GetInst 时才会创建实例,如许可以制止步伐启动时不须要的内存斲丧。
在C++11以下的
版本
中,使用你提供的懒汉式单例实现大概会遇到线程安全标题。详细来说,标题出现在静态局部变量 single 的初始化上。
线程安全标题
在C++11之前,局部静态变量的初始化不是线程安全的。假如多个线程同时初次调用 GetInst 方法,有大概会发生竞态条件(race condition),导致创建出多个 Single2 实例,粉碎了单例模式的初志。
办理方法
假如必要在C++11以下的
版本
中确保线程安全,可以思量以下几种方法:
双重查抄锁定(Double-Checked Locking)
:
class Single2
{
private:
static Single2* instance;
static std::mutex mtx;
Single2() {}
Single2(const Single2 &) = delete;
Single2 &operator=(const Single2 &) = delete;
public:
static Single2* GetInst()
{
if (instance == nullptr) // 第一次检查
{
std::lock_guard<std::mutex> lock(mtx); // 加锁
if (instance == nullptr) // 第二次检查
{
instance = new Single2();
}
}
return instance;
}
};
Single2* Single2::instance = nullptr;
std::mutex Single2::mtx;
复制
代码
静态成员变量初始化(线程不安全版本)
:
假如你确定单例只会在单线程环境下使用,可以使用以下更简朴的方式:
class Single2
{
private:
static Single2* instance;
Single2() {}
Single2(const Single2 &) = delete;
Single2 &operator=(const Single2 &) = delete;
public:
static Single2* GetInst()
{
if (instance == nullptr)
{
instance = new Single2();
}
return instance;
}
};
Single2* Single2::instance = nullptr;
复制
代码
这种实现不实用于多线程环境。
C++11 引入了一些新的特性和改进,此中之一就是包管了局部静态变量的线程安全性。这意味着在 C++11 及更高版本中,局部静态变量的初始化是由编译器主动处置处罚的,而且包管了这种初始化过程在多线程环境下是安全的。
C++11 之前的标题
在 C++11 之前,当多个线程同时初次访问一个局部静态变量时,大概会出现竞态条件(Race Condition),导致多个线程同时进入变量的初始化过程。由于这个初始化过程没有得到线程的同步掩护,大概会导致初始化多次,进而粉碎单例模式的唯一性要求。
C++11 的改进
C++11 标准引入了以下包管:
局部静态变量的初始化是线程安全的
:C++11 规定,假如多个线程试图同时初始化同一个局部静态变量,只有一个线程会乐成初始化它,而其他线程会被壅闭,直到初始化完成。这就确保了静态局部变量在多线程环境下也只会被初始化一次。
懒汉式单例的线程安全性
:由于局部静态变量的初始化已经是线程安全的,在 C++11 及更高版本中,可以安全地使用局部静态变量来实现懒汉式单例模式,无需额外的锁机制来防止竞态条件。
C++11 线程安全的实现机制
在底层,C++11 通过引入新的机制,确保了局部静态变量初始化的线程安全。这些机制包罗:
线程同步机制
:C++11 在初始化局部静态变量时,使用了编译器提供的同步机制(如锁、屏蔽等)来确保在多线程环境下,只有一个线程可以实行初始化代码。
按需初始化
:C++11 确保局部静态变量在初次使用时才会被初始化,这种方式不但节省资源,还包管了多线程环境中的唯一性。
回复
使用道具
举报
返回列表
浏览过的版块
Java
网络安全
前端开发
分布式数据库
Oracle
云原生
程序人生
鸿蒙
大连全瓷种植牙齿制作中心
+ 我要发帖
登录后关闭弹窗
登录参与点评抽奖 加入IT实名职场社区
去登录
微信订阅号
微信服务号
微信客服(加群)
H5
小程序
快速回复
返回顶部
返回列表