1. 程式人生 > >C++中多執行緒的加鎖機制

C++中多執行緒的加鎖機制

問題來源於某面試題:

編寫一個單例模式的類。

#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);
		}

};