在整个项目中,某个特殊的类,只能创建一个对象,多的创建不了。
私有化构造函数,不能直接生成类对象了
class Single {
private:
static Single* single;
private:
Single(){} //私有化构造函数
public:
static Single* GetInstance()
{
if (single == NULL) {
single = new Single();
}
return single;
}
};
Single* Single::single = NULL;
int main()
{
Single* My_Instace = Single::GetInstance();
return 0;
}
仅给外部一个GetInstance的接口,而且无论外部试图创建多少次对象,都返回同一个地址。
如果该单例模式仅用于只读的情况是没有问题的,如果在多线程中调用此接口会出现问题。
using namespace std;
mutex resource_mutex;
class Single {
private:
static Single* single;
private:
Single(){} //私有化构造函数
public:
static Single* GetInstance()
{
unique_lock<mutex> myulock(resource_mutex);
if (single == NULL) {
single = new Single();
}
return single;
}
};
Single* Single::single = NULL;
void MyThread() {
Single *My_Instance = Single::GetInstance();
}
int main()
{
thread mytobj1(MyThread);
thread mytobj2(MyThread);
mytobj1.join();
mytobj2.join();
return 0;
}
使用互斥量锁住是线程安全的,但是这么粗暴的锁会降低效率其实只需要双重检查(double check)就行了
public:
static Single* GetInstance()
{
if (single == NULL) {
unique_lock<mutex> myulock(resource_mutex);
if (single == NULL) {
single = new Single();
}
return single;
}
}
};
本文探讨了如何在C++中通过单例模式确保全局只有一个对象,并提供了线程安全的实现方法,包括使用互斥量和双重检查锁定。同时强调了过度锁住可能带来的效率问题。
1282

被折叠的 条评论
为什么被折叠?



