线程安全的singleton

来源:互联网 发布:windows系统架构图 编辑:程序博客网 时间:2024/03/29 20:01
#ifndef _SINGLETON_H_#define _SINGLETON_H_#include "MultiThread.h"class singleton{public:    ~singleton()    {    }    static singleton* getInstance()    {        MutexLockGuard lock(mutex_);        if(NULL == instance_)        {            instance_ = new singleton();        }        return instance_;    }private:    singleton()    {    }    static singleton* instance_;    Mutex mutex_;};singleton* singleton::instance_ = NULL;#endif //_SINGLETON_H_

上面解法不是很完美,每次getInstance都会加锁,二加锁是一个非常耗时的操作,在没有必要时应尽量避免。

我们只是在实例还没有创建之前需要加锁操作,以保证只有一个线程创建出实例。而当实例已经创建成功,我们已经

不需要再做加锁操作了,读是线程安全的。上述代码修改如下:

#ifndef _SINGLETON_H_#define _SINGLETON_H_#include "MultiThread.h"class singleton{public:    ~singleton()    {    }    static singleton* getInstance()    {        if(NULL == instance_)        {            MutexLockGuard lock(mutex_);//作用域为临界区            if(NULL == instance_)            {                instance_ = new singleton();            }        }        return instance_;    }private:    singleton()    {    }    static singleton* instance_;    Mutex mutex_;};singleton* singleton::instance_ = NULL;#endif //_SINGLETON_H_


原创粉丝点击