一般用鎖配合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.