(八)单例设计模式共享数据分析, call_once

单例模式:

整个项目中只能有一个单例类对象,不能创建多个;

简单实现的例子:

//单例类
class MySingleClass {
private:
	MySingleClass() {};//私有化构造函数 这样就不能创建多个对象了
private:
	static MySingleClass* m_instance;
public:
	static MySingleClass* GetInstance() {
		if (m_instance == NULL) {
			m_instance = new MySingleClass();
		}
		return m_instance;
	}
};

安全模式的例子,面向多线程的稳定性提升:

//单例类
std::mutex resource_mutex;
class MySingleClass {
private:
	MySingleClass() {};//私有化构造函数 这样就不能创建多个对象了
private:
	static MySingleClass* m_instance;
public:
	static MySingleClass* GetInstance() {
		if (m_instance == NULL){//提高效率 防止每次都尝试加锁
			std::unique_lock<std::mutex> mymutex(resource_mutex);
			if (m_instance == NULL) {
				m_instance = new MySingleClass();
				static Freeminstance f;//自动析构new的变量
			}
		}
		return m_instance;
	}
	class Freeminstance {
	public:
		~Freeminstance() {
			if (MySingleClass::m_instance) {
				delete MySingleClass::m_instance;
				MySingleClass::m_instance = NULL;
			}
		}

	};
};

call_once:

保证传入的函数只被调用一次,具备互斥量的能力,比互斥量消耗的资源更少;与一个标记结合使用;

利用call_once定义单例类:

//单例类
std::mutex resource_mutex;
std::once_flag g_flag;
class MySingleClass {
private:
	MySingleClass() {};//私有化构造函数 这样就不能创建多个对象了
private:
	static MySingleClass* m_instance;
public:
	static void CreateInstance() {
		m_instance = new MySingleClass();
		static Freeminstance f;//自动析构new的变量
	}
	static MySingleClass* GetInstance() {
		std::call_once(g_flag, CreateInstance);//两个线程同时执行到这一行,其中一个线程要等另一个线程执行完毕,第二个线程才会考虑要不要执行
		return m_instance;
	}
	class Freeminstance {
	public:
		~Freeminstance() {
			if (MySingleClass::m_instance) {
				delete MySingleClass::m_instance;
				MySingleClass::m_instance = NULL;
			}
		}

	};
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值