通过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;
}