实现一个自动锁

通过C++的构造函数和析构函数来实现对 临界区函数的封装

#include<windows.h>
#include<process.h>
#include<stdio.h>


CRITICAL_SECTION cs;//定义全局资源后马上定义一把锁
class CLock{
public:
	CLock()
	{
		InitializeCriticalSection(&cs);
	}
	~CLock()
	{
		DeleteCriticalSection(&cs);
	}
	void Lock()
	{
		EnterCriticalSection(&cs);
	}
	void Unlock()
	{
		LeaveCriticalSection(&cs);
	}
private:
	CRITICAL_SECTION cs;
};
class CAutoLock {
public:
	CAutoLock(CLock* pLock) :m_pLock(pLock)//相当于m_pLock = pLock
	{
		
		m_pLock->Lock();
	}
	~CAutoLock()
	{
		m_pLock->Unlock();
	}
private:
	CLock* m_pLock;
};
int g_iValue = 0;
CLock g_clock;
UINT _stdcall ThreadProc(LPVOID arg) {


	for (int i = 0;i < 5;i++) {
		CAutoLock a(&g_clock);//调用CAutoLock的构造函数加锁
		g_iValue++;
		printf("g_iValue = %d\n", g_iValue);
		//a作为对象会被自动销毁,调用析构函数 放锁
	}

	return 1;
}

int main(int argc, char* argv[])
{
	HANDLE hArray[2] = { 0 };

	InitializeCriticalSection(&cs);//初始化临界区
	unsigned  tid = 0;


	hArray[0] = (HANDLE)_beginthreadex(NULL, 0, ThreadProc, NULL, 0, &tid);
	hArray[1] = (HANDLE)_beginthreadex(NULL, 0, ThreadProc, NULL, 0, &tid);

	WaitForMultipleObjects(2, hArray, TRUE, INFINITE);

	CloseHandle(hArray[0]);
	CloseHandle(hArray[1]);

	DeleteCriticalSection(&cs);//删除锁

	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值