线程安全的C++单例模式

/*
线程安全单例模式:

1. 局部静态懒汉式

2. 饿汉式

3. 加锁懒汉式

*/
//1.局部静态成员 懒汉式
//适合C++11,保证静态局部变量的初始化是线程安全的。如果是C++98就不能用这个方法。
class Singleton {
private:
	Singleton() {};
	Singleton(const Singleton &) {};
	Singleton& operator= (const Singleton &);

public:
	static Singleton getInstance()
	{
		static Singleton m_instance;
		return m_instance;
	}
	//test do something
	void doSomething() { cout << "doSomething in Singleton" << endl; }
};
//2.饿汉式
//优点:线程安全,不用加锁效率高
//确定:类加载时就初始化,浪费内存。
class Singleton2
{
private:
	static Singleton2* m_instance;
	Singleton2() {};

public:
	static Singleton2* getInstance()
	{
		return m_instance;
	}
	//test do something
	void doSomething() { cout << "doSomething in Singleton2" << endl; }
};
//外部初始化 before invoke main
Singleton2* Singleton2::m_instance = new Singleton2();
//3. 加锁 懒汉式
class Singleton3
{
private:
	Singleton3() {};
	static Singleton3* m_instance;
	static mutex m_mutex;

public:
	static Singleton3* getInstance()
	{
		if (m_instance == NULL)
		{
			std::lock_guard<std::mutex> lock(m_mutex);
			if (m_instance == NULL)
				m_instance = new Singleton3();
		}
		return m_instance;
	}
	//test do something
	void doSomething() { cout << "doSomething in Singleton3" << endl; }
};
Singleton3* Singleton3::m_instance = NULL;
mutex Singleton3::m_mutex;

测试代码

int main()
{
	Singleton::getInstance().doSomething();
	Singleton2::getInstance()->doSomething();
	Singleton3::getInstance()->doSomething();
	system("pause");
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值