现在的位置: 首页 > 综合 > 正文

C++中多线程的加锁机制

2019年03月07日 ⁄ 综合 ⁄ 共 859字 ⁄ 字号 评论关闭

问题来源于某面试题:

编写一个单例模式的类。

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

};

抱歉!评论已关闭.