单例模式:
整个项目中只能有一个单例类对象,不能创建多个;
简单实现的例子:
//单例类
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;
}
}
};
};
|