class Lock { CRITICAL_SECTION mSection; public: Lock(){ InitializeCriticalSection(&mSection); } ~Lock(){ DeleteCriticalSection(&mSection); } void Acquire(){ EnterCriticalSection(&mSection); } void Release(){ LeaveCriticalSection(&mSection); } };2nd: We need a guard for the lock. Just for convenience and to be foolproof. Keyword: RAII, guard. See also: auto_ptr.
class Guard { Lock *pLock; public: Guard(Lock &lock) : pLock(&lock) { pLock->Acquire(); } ~Guard(){ pLock->Release(); } };3rd: We can get down to business with our singleton. Do not forget to hide the default constructors and the '=' operator. Keywords: singleton, multi-thread, thread-safe, storage, operator overloading.
singleton.h:
class Singleton { public: static Singleton *GetInstance(); // other public members private: Singleton(); ~Singleton(); Singleton(const Singleton&); const Singleton& operator=(const Singleton&); static Singleton* pInstance; static Lock instanceLock; // other private members };singleton.cpp:
#include "singleton.h" // Storage place for static members: Singleton* Singleton::pInstance = 0; Lock Singleton::instanceLock; Singleton::Singleton(){ /* as you wish */ } Singleton::~Singleton(){ /* as you wish */ } Singleton* Singleton::GetInstance() { if(pInstance) return pInstane; Guard g(instanceLock); if(!pInstance) pInstance = new Singleton(); return pInstance; }
Feel free to search the web for the keywords, or any word you read here.
No comments:
Post a Comment