C++单例模式设计

单例模式
保持系统中某一个类只有一个实例才能保持他们逻辑的正确性以及良好的效率。
class Singleton
{
private:
Singleton();
Singleton(conse Singleton& other);

public:
static Singleton* getInstance( );
static Singleton* m_Instance( );
}
//非线性版本,在单线程情况下是安全的,但是在多线程环境下不行,时间片的问题可能多个线程进入m_instance=new Singleton。
Singteton* Singleton::getInstance( )
{
if(m_instance==nullptr)
{
m_instance=new Singleton();
}
return m_instance;
}

//线性安全版本, 比非线性版本更高,加锁类似与linux原子操作,但是加锁代价比较高,假如对象已经不是nullptr,有一个或者多个只读线程访问m_instance,每次都会等待获取锁,此时锁是多余的。在高并发的系统中代价过高。
Singteton* Singleton::getInstance( )
{
Lock lock;
if(m_instance==nullptr)
{
m_instance=new Singleton();
}
return m_instance;
}

//双检查锁,但由于内存读写reorder不安全
Singteton* Singleton::getInstance( )
{
if(m_instancenullptr) //解决只读线程上锁代价
{
Lock lock;
if(m_instance
nullptr) //可能有两个线程都进入到锁为止,
m_instance=new Singleton();
}
return m_instance;
}
m_instance=new Singleton()//可能出现指令级别得执行顺序问题,由于编译器优化 线程A执行m_instance=new Singleton()可能出现先分配类存,赋值指针,再调用构造函 数(reorder),再复制指针之后调用构造函数之前,线程B有可能执行到第一个检查锁,此时非空,返回m_instance将是一个没有初始化得内存,没法使用该指针。
std::atomic<Singleton*> Singleton::m_instance;
std::mutex Singleton::m_mutex;
Singteton* Singleton::getInstance( )
{
Singleton* temp=m_instance.load(std::memory_order_relaxed);
std::atomic_thread_fence(std:memory_order_acquire);//获取内存fence,之后讲屏蔽编译器reorder问题。
if(tempnullptr)
{
std::lock_guardstd::mutex lock(m_mutex);
temp=m_instance.load(std::memory_order_relaxed);
if(temp
nullptr)
{
temp=new Singleton();
std:: atomic_thread_fence(std:memory_order_release); //释放内存fence
m_instance.store(temp,std::momory_order_relaxed);
}
}
return temp;//返回m_instance,temp都可以。
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值