单例应该这样写

Code First:

CIndexManager *CIndexManager::s_instance;
boost::mutex CIndexManager::s_mutex;
CIndexManager::CGarbo CIndexManager::s_garbo;
CIndexManager *CIndexManager::GetInstance()
{
    if (s_instance == NULL)
    {
        boost::mutex::scoped_lock lock(s_mutex);
        if (s_instance == NULL)
        {
            s_instance = new CIndexManager();
        }
    }

    return s_instance;
}

特点:

1. Lazy Initilization , 当单例不被使用时不会被初始化;

2. Double Check, 两次判空的用意是,在对性能要求较高的时候,直接加锁会形成瓶颈,初始化之后,每次只需判空即能判断是否初始化过;

不足之处是,没有翻译语句,所以可以在类内部加上,

class CIndexManager {    
    static boost::mutex s_mutex;
    static CIndexManager *s_instance;
    static CIndexManager *GetInstance();

    class CGarbo
    {
    public:

        ~CGarbo()
        {
            if (s_instance != NULL)
            {
                delete s_instance;
            }
        }
    };

    static CGarbo s_garbo;
};

这样,s_garbo 在释放时就可以翻译单例了,一个小的包装类来完成释放工作!

当然有人会说,并行时,有可能 s_instance 先被赋值,构造函数后被调用,有一定的风险,当然 VC 上暂时没发现这种特例,如果你高兴,也可以加上原子操作屏障来阻止这类事情的发生,这里不谈。


Over !

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值