實現乙個單例模式需要:1>私有的建構函式。2>乙個靜態方法,返回這個唯一例項的引用。3>乙個指標靜態變數。4>選擇乙個解決多執行緒問題的方法。
1.把建構函式宣告為私有,則只有singleton類內的可以呼叫建構函式。
2.用靜態方法來例項化這個物件,並返回這個物件。
3.利用乙個靜態變數來記錄singleton類的唯一例項。
4.解決多執行緒問題的方法如下
在陳碩的《linux多執行緒服務端程式設計》上的使用pthread_once實現的單例模式
關於pthread_once的內容可以看:pthread_once
在static t& instance()中使用pthread_once()呼叫init,會保證init()只會呼叫一次。
templateclass singleton : boost::noncopyable
private:
singleton();
~singleton();
static void init()
private:
static pthread_once_t ponce_;
static t* value_;
};templatepthread_once_t singleton::ponce_ = pthread_once_init;
templatet* singleton::value_ = null;
在c++中,std::call_once和std::once_flag代替了上面的pthread_once和pthread_once_t。
自己根據上面思路改編的乙個c++單例模式:
logger.h
#ifndef _logger
#define _logger
#include #include #include #include #include #include class logger
;#endif
logger.cpp
#include "logger.h"
using namespace std;
const string logger::klogleveldebug = "debug";
const string logger::kloglevelinfo = "info";
const string logger::kloglevelerror = "error";
const char* logger::klogfilename = "log.out";
logger* logger::pinstance = null;
once_flag logger::monceflag;
mutex logger::smutex;
void logger::init()
logger& logger::instance()
logger::~logger()
logger::logger()
void logger::log(const vector& inmessages, const string& inloglevel)
{ lock_guardlck(logger::smutex);
for(size_t i=0; i
pthread once與執行緒安全的單例模式
在單例模式的class設計的時候,常常會看到一種寫法 if null return 這個辦法叫做double check locking 縮寫為dcl 在 linux多執行緒服務端 一書中,作者提出dcl已經靠不住,並提出了使用pthread once來實現單例的執行緒安全。include int ...
單例模式 單例模式
餓漢式 急切例項化 public class eagersingleton 2.宣告靜態成員變數並賦初始值 類初始化的時候靜態變數就被載入,因此叫做餓漢式 public static eagersingleton eagersingleton new eagersingleton 3.對外暴露公共的...
單例 單例模式
簡單的實現乙個單例 instancetype sharedinstance return instance 真正的單例模式 myclass sharedinstance return instance id allocwithzone nszone zone return nil id copywi...