提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、懒汉式--单线程正确
代码如下(示例):
class Singleton
{
private:
Singleton(){};
static Singleton *pInstance;
public:
static Singleton *getInstance()
{
if(pInstance == nullptr)
{
pInstance = new Singleton();
}
return pInstance;
}
};
二、双重检查锁懒汉式
代码如下(示例):
class Singleton
{
private:
Singleton(){};
static Singleton *pInstance;
public:
static Singleton *getInstance()
{
if(pInstance == nullptr)
{
Lock();
if(pInstance == nullptr)
{
pInstance = new Singleton();
}
UnLock();
}
return pInstance;
}
};
问题:
pInstance = new Singleton(),包含三步--分配内存,调用构造函数,把内存地址赋值给pInstance;
而后两步顺序是可以颠倒的,会出现A线程刚执行第三步但第二步还没执行,此时切换到B线程会出现返回一个未构造完成的对象,程序崩溃.
解决思路:barrier指令:
//:__asm__表示这个是一条汇编命令,
//valotial关键字表示要求编译器严格按照这个顺序进行编译,
//不允许改变执行顺序
#define barrier __asm__vloatile ("lwsyc")
volatile Singleton* pInstance = 0;
Singleton * getInstance()
{
if(!pInstance)
{
Lock();
if(!pInstanc)
{
Singleton *temp = new Singleton;
barrier();
pInstance = temp;
}
UnLock();
}
return pInstance();
}
三、饿汉式
原来,C++11:编译器能保证内部静态变量的线程安全性
class Singleton
{
private:
Singleton(){};
public:
static Singleton *getInstance()
{
static Singleton Instance;
return &Instance;
}
};
四、引用
- https://blog.csdn.net/qq_36459662/article/details/106901292#t9
- https://blog.csdn.net/u012940886/article/details/80386669