AutoCriticalSection.h
#pragma once
#include <WTypes.h>
/*!
* 自动加锁、解锁的临界区类
*/
class CAutoCriticalSection
{
private :
CRITICAL_SECTION *m_pCS ; //!< 临界区对象指针,指向一个需要加锁的临界区对象
public :
//! 构造函数
/*!
* 通过传入一个临界区对象的引用,实现对这个临界区的加锁
* @param cs 需要加锁的临界区对象,这个对象应该是已经正确的调用了InitializeCriticalSection
*/
CAutoCriticalSection( CRITICAL_SECTION& cs ) : m_pCS( &cs )
{
::EnterCriticalSection( m_pCS ) ;
}
CAutoCriticalSection( PCRITICAL_SECTION pCS ) : m_pCS( pCS )
{
if( m_pCS )
{ // 临界区对象有效
::EnterCriticalSection( m_pCS ) ;
}
}
//! 析构函数
/*!
* 自动解除对传入的临界区的解锁
*/
~CAutoCriticalSection()
{
if( NULL != m_pCS )
{ // 临界区对象有效
::LeaveCriticalSection( m_pCS ) ;
}
}
} ;
测试代码:
#include <iostream>
#include "AutoCriticalSection.h"
using namespace std;
DWORD WINAPI Fun1Proc(
LPVOID lpParameter // thread data
);
DWORD WINAPI Fun2Proc(
LPVOID lpParameter // thread data
);
int tickets=100;
CRITICAL_SECTION g_cs;
void main()
{
InitializeCriticalSection(&g_cs);
HANDLE hThread1;
HANDLE hThread2;
hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
Sleep(400000);
DeleteCriticalSection(&g_cs);
system("pause");
return;
}
DWORD WINAPI Fun1Proc(
LPVOID lpParameter // thread data
)
{
while(TRUE)
{
CAutoCriticalSection cs( &g_cs ) ; // 自动锁定服务信息锁
if(tickets>0)
{
Sleep(1);
cout<<"thread1 sell ticket : "<<tickets--<<endl;
}
else
break;
}
return 0;
}
DWORD WINAPI Fun2Proc(
LPVOID lpParameter // thread data
)
{
while(TRUE)
{
CAutoCriticalSection cs( &g_cs ) ; // 自动锁定服务信息锁
if(tickets>0)
{
Sleep(1);
cout<<"thread2 sell ticket : "<<tickets--<<endl;
}
else
break;
}
cout<<"thread2 is running!"<<endl;
return 0;
}