muduo庫源碼解析:單例模式singleton

單例模式實現

boost::noncopyable 防止複製,如果是自己實現,那要把構造函數拷貝構造,複製構造都私有

公有方法:

獲取單例對象:instance() 返回 value 引用,(第一次 -->pthread_once --> init  ) 

私有

初始化new一單例:init()--並 atexit 註冊銷燬函數釋放delete value

構造函數、拷貝構造,複製構造

析構函數

靜態實際對象vaue指針,靜態pthread_once_t


1.空用一個變量tt,聲明瞭變量但是沒有使用 編譯時加 Wno-unused-parameter,會報錯

(void)  tt;

2.防止delete一個不完全對象

//typedef定義一個char數組類型 T_MUST_BE_COMPELET_TYPE :char[-1]---如果T只聲明沒有定義-不完全類型, 沒定義就沒有析構函數,delete就不會調用析構函數了; char[1]--T是完全類型,即有定義,delete操作,可以調用析構函數
typedef char T_must_be_complete_type[sizeof(T)==0?-1:1];

//下面兩句主要是防止報錯,Werror=unused-local-typedefs,Wno-unused-parameter
T_must_be_complete_type tt;
(void)tt;

#ifndef MUDUO_BASE_SINGLETION_h
#define MUDUO_BASE_SINGLETION_h

#include <boost/noncopyable.hpp>
#include <pthread.h>
#include <stdlib.h> //atexit

namespace muduo
{

template<typename T>
class Singleton : boost::noncopyable
{
  public:
	static T& instance()
	{
		pthread_once( &ponce_, Singleton::init );
		return *value_;						 
	}

  private:
	Singleton();
	~Singleton();
	static void init()
	{
		value_ = new T();
		atexit(destroy);
	}
	static void destroy()
	{
		//定義一個char數組類型 T_MUST_BE_COMPELET_TYPE :char[-1]---如果T只聲明沒有定義-不完全類型 ; char[1]--T是完全類型,即有定義,delete操作,可以調用析構函數,沒定義就沒有析構函數,delete就不會調用析構函數了
		typedef char T_must_be_complete_type[sizeof(T)==0?-1:1];
		T_must_be_complete_type tt;
		(void)tt;
		delete value_;
	}
  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;

}

參考:c++教程網

           muduo網絡庫

           linux多線程服務器端編程》.陳碩


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