天天看點

從零開始學C++之模闆(四):用模闆實作單例模式(線程安全)、模闆方式實作動态建立對象

一、用模闆實作單例模式

在前面的文章中,用過多種方法實作單例模式,現在用模闆方式來實作:

為了實作線程安全,需要在linux 下使用pthread_mutex_t 加鎖,請使用g++ 編譯并需要連結 -lpthread

使用的是double-check lock, 指針instance_ 最好聲明為volatile,防止優化。

Singleton.h:

main.cpp:

從零開始學C++之模闆(四):用模闆實作單例模式(線程安全)、模闆方式實作動态建立對象

即 将Singleton 實作為模闆類,将ApplicationImpl 類包裝成單例模式類,可以看到構造函數和析構函數都隻調用了一次。程式使用一個小技巧,用axexit 函數注冊了程式結束時需要調用的函數。

二、模闆方式實作動态建立對象

在前面的文章曾經使用宏定義的方式實作動态建立對象,現在在 DynBase.h 中用模闆類将宏定義替換掉,其他代碼不變:

即 REGISTER_CLASS(class_name) 宏定義展開會構造一個模闆類執行個體對象,調用3次宏定義即3個模闆類執行個體對象,調用構造函數

DelegatingClass(const string &name),進而調用Register 完成注冊,接下去的流程與以前的程式一樣,不再贅述。輸出如下:

從零開始學C++之模闆(四):用模闆實作單例模式(線程安全)、模闆方式實作動态建立對象

參考:

C++ primer 第四版

Effective C++ 3rd

C++程式設計規範