单例模式

单例模式

定义: 在程序运行中, 只能生成一个对象 的模式

模式要点: 1, 为了保证在 外部 不被定义对象, 需要把构造函数设置成私有属性

2, 故此, 需要一个static函数来定义对象, 又因唯一性, 需要一个static指针变量来保证不重复 创建

3, 虽然唯一, 但可以被多个函数或对象公用, 为防止在销毁时 多次释放同一指针 , 需要一个static整形变量计数

4,为防止多个线程同时调用,引起的线程不安全, 需要一个互斥锁, 锁住static指针变量, 故锁也是static属性

5,仅在第一次创建的时候需要调用互斥锁, 为防止多次调用内核, 因在前面再加一次判断


下面是代码是例

#include <iostream>
#include <pthread.h>
using namespace std;


// 懒汉式单例
class UserManage
{
private:
	UserManage()
	{
		cout << "用户管理器被构造" << endl;
		sleep(5);
	}
public:
	static UserManage * GetInstance()			//创造句柄
	{
		count ++;
		if(m_instance == NULL)  			// 判断, 防止多次开锁解锁
		{
			pthread_mutex_lock(&mutex);		// 上锁
			if(m_instance == NULL)
				m_instance = new UserManage; 	// 构造
			pthread_mutex_unlock(&mutex);		// 解锁
		}
		return m_instance;
	}

	static void Release()					// 释放句柄
	{
		count --;
		
		pthread_mutex_lock(&mutex);	
		if(m_instance != NULL && count == 0)
		{
			delete m_instance;
			m_instance = NULL;
		}
		pthread_mutex_unlock(&mutex);
	}

private:
	static pthread_mutex_t mutex;
	static UserManage * m_instance;
	static int count;
};

//静态变量 需要在外部初始化
UserManage * UserManage::m_instance = NULL;
int UserManage::count = 0;
pthread_mutex_t UserManage::mutex = PTHREAD_MUTEX_INITIALIZER; 

void  *func(void* v)
{
	UserManage *um = UserManage::GetInstance();
	
	//UserManage::Release();
}

int main()
{
	pthread_t id[10];
	for(int i = 0; i<10; i++)
	{
		pthread_create(&id[i], NULL, func, NULL);
		pthread_detach(id[i]); 
	}	
	
	pthread_exit(NULL);   		 			// 终止主线程
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值