Muduo庫源碼分析(8):單例模式實現

  • 單例模式
    保證一個類只有一個實例,並提供一個訪問它的全局訪問點
  • 參考資料
    C++設計模式——單例模式: http://www.jellythink.com/archives/82
  • Muduo庫實現單例模式的思想:
    通過pthread_once在多個線程中只會初始化一次的特性實現的線程安全的單例模式
template<typename T>
class Singleton : noncopyable
{
 public:
  static T& instance()
  {
  //ponce_=PTHREAD_ONCE_INIT;所以該函數只會初始化一次init函數,哪個線程實現初始化取決於哪個線程先搶佔CPU的執行權
    pthread_once(&ponce_, &Singleton::init);
    assert(value_ != NULL);
    return *value_;
  }

 private:
  Singleton();
  ~Singleton();

  static void init()
  {
    value_ = new T();
    if (!detail::has_no_destroy<T>::value)
    {
      ::atexit(destroy);
    }
  }

  static void destroy()
  {
    typedef char T_must_be_complete_type[sizeof(T) == 0 ? -1 : 1];
    T_must_be_complete_type dummy; (void) dummy;

    delete value_;
    value_ = NULL;
  }

 private:
  static pthread_once_t ponce_;// 條件變量
  static T*             value_;// 單例對象
};

template<typename T>
pthread_once_t Singleton<T>::ponce_ = PTHREAD_ONCE_INIT;

template<typename T>
T* Singleton<T>::value_ = NULL;

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章