一般用锁配合double check即可。
class singleton
{
public:
~singleton();
static singleton* get_instance();
private:
singleton();
singleton(const singleton& emg);
singleton& operator = (const singleton& emg);
void destroy();
static singleton* instance_;
static boost::mutex mutex_;
};// class singleton
singleton* singleton::instance_ = NULL;
boost::mutex singleton::mutex_;
singleton* singleton::get_instance()
{
if(instance_ == NULL)
{
boost::mutex::scoped_lock lock(mutex_);
if(instance_ == NULL)
{
instance_ = new singleton();
}
}
return instance_;
}
一般情况下,一个进程中只存在一个实例且其生存期与进程相同,但偶尔也会有这样的情况,即这个实例偶尔需要析构,然后又重新获得,这个
时候就需要在析构函数中将instance_ = NULL,如果是智能指针也需要reset一下,因为第二次重新获得实例后,需要判断这个instance_是否为
NULL,而第一次获得的实例析构后就需要确保instance_ == NULL.