利用C++11特性实现的多线程安全的单例模式

本文探讨了单例模式在多线程环境中的实现,包括饿汉模式、懒汉模式以及简单加锁实现的线程安全问题。特别指出二次锁定检查模式的非线程安全性,并介绍了如何利用C++11的`std::call_once`来确保线程安全地创建单例,避免性能浪费。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单例模式保证某个类对象在进程中只被初始化一次,使用的场景是对一个可复用的资源在一个进程中只初始化一次直到进程结束再释放,这样就可以避免重复构造析构带来的额外性能消耗

 

目录

饿汉模式

 懒汉模式

 简单加锁实现的低效的线程安全

 臭名昭著的二次锁定检查模式(实际上非线程安全)

 利用C++11的call_once实现线程安全的单例模式

参考书籍


饿汉模式

 饿汉模式的特点是空间换时间,无论我们需要的类在什么时候使用,一律在进程开始时进行初始化,优点当然是方便不会有什么线程安全问题,缺点是会带来额外的空间损耗

#include<iostream>
class Singleton
{
private:
	Singleton()
	{
		std::cout << "Singleton()" << std::endl;
	}
	static Singleton* p;
public:
	static Singleton* instance();

	void show()
	{
		std::cout << "Show Singleton" << std::endl;
	}
};

Singleton* Singleton::p = new Singleton();

Singleton* Singleton::instance()
{
	return p;
}


int main()
{
	Singleton* temp = Singleton::instance();

	temp->show();

	system("pause");
	return 0;
}

 懒汉模式

 懒汉模式的特点是时间换空间,只有在类对象真正被使用到时才进行初始化

 简单加锁实现的低效的线程安全

#include<iostream>
#include<mutex>
class Singleton
{
private:
	Singleton()
	{
		std::cout <&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值