單例設計模式共享資料分析、解決,call_once
阿新 • • 發佈:2018-12-21
單例設計模式
class MyCAS { private: MyCAS() {} private: static MyCAS *instance; public: static MyCAS *GetInstance() { if (instance == NULL) { instance = new MyCAS(); static MyCAS_Recover cl; } return instance; } class MyCAS_Recover //釋放記憶體 { public: ~MyCAS_Recover() { if (MyCAS::instance) { delete MyCAS::instance; MyCAS::instance = NULL; } } }; void fun() { cout << &instance << endl; } }; //靜態成員初始化 MyCAS *MyCAS::instance = NULL; int main() { MyCAS *p_a=MyCAS::GetInstance(); MyCAS *p_b = MyCAS::GetInstance(); p_a->fun(); p_b->fun(); return 0; }
引入執行緒的概念
static mutex resource_mutex; class MyCAS { private: MyCAS() {} private: static MyCAS *instance; public: static MyCAS *GetInstance() { //提高效率 if (instance == NULL) { unique_lock<mutex> mymutex(resource_mutex); if (instance == NULL) { instance = new MyCAS(); static MyCAS_Recover cl; } } return instance; } class MyCAS_Recover //釋放記憶體 { public: ~MyCAS_Recover() { if (MyCAS::instance) { delete MyCAS::instance; MyCAS::instance = NULL; } } }; void fun() { cout << &instance << endl; } }; //靜態成員初始化 MyCAS *MyCAS::instance = NULL; void mythread() { MyCAS *p_a = MyCAS::GetInstance(); } int main() { std::thread thread_1(mythread); std::thread thread_2(mythread); thread_1.join(); thread_2.join(); return 0; }
std::call_once():能夠保證函式A只被呼叫一次。
static mutex resource_mutex; once_flag o_f; class MyCAS { private: MyCAS() {} private: static MyCAS *instance; static void CreateInstance() { instance = new MyCAS(); static MyCAS_Recover cl; } public: static MyCAS *GetInstance() { call_once(o_f, CreateInstance); return instance; } class MyCAS_Recover //釋放記憶體 { public: ~MyCAS_Recover() { if (MyCAS::instance) { delete MyCAS::instance; MyCAS::instance = NULL; } } }; void fun() { cout << &instance << endl; } };