C++中多執行緒的加鎖機制
阿新 • • 發佈:2018-12-27
問題來源於某面試題:
編寫一個單例模式的類。
#include<iostream> #include<cstdio> #include<cstdlib> using namespace std; class singleStance{ private : singleStance(); public : static singleStance* onlystance; static singleStance* getStance(){ if(!onlystance){ onlystance = new singleStance(); } return onlystance; } }; int main(){ return 0; }
事實上這樣已經完成了單例模式的目標。
但是事實上也只會在單執行緒模式下起作用。
試想,如果多執行緒下同時進入if(!onlystance)就有可能出現錯誤。
所以顯然是需要加入互斥鎖的。
class singleStance{ private : singleStance(); public : static singleStance* onlystance; static singleStance* getStance(){ lockBase* lockbase = new lockBase(); lockBase->lock(); if(onlystance){ onlystance = new singleStance(); } lockBase->unlock(); return onlystance; } }; class lockBase{ protected: friend class singleStance; CRITICAL_SECTION cs; public : lockBase(){ ::InitializeCriticalSection(&cs); } void lock(){ ::EnterCriticalSection(&cs); } void unlock(){ ::LeaveCriticalSection(&cs); } ~lockBase(){ ::DeleteCriticalSection(&cs); } };