单例模式
定义: 在程序运行中, 只能生成一个对象 的模式
模式要点: 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;
}