锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
#include"stdafx.h"
#include<windows.h>
/**//*瀵逛簬涓鍧椾復鐣屽尯
**鍙互鍚屾椂璇?br>
**褰撹鍐欐椂錛岀瓑寰呮墍鏈夌殑璇昏呯寮錛屽悗鏉ョ殑璇昏呬笉鍏佽榪涘叆
**鍥犱負鍦ㄥ悓涓涓繘紼嬩腑
**鎵浠ヤ嬌鐢ㄤ復鐣屽尯錛岃屼笉鏄嬌鐢ㄤ簰鏂ュ璞★紝鍥犱負榪欐牱姣旇緝鑺傜渷璧勬簮
*/
class __declspec(novtable) auto_RWLock

{
public:
auto_RWLock(void);
~auto_RWLock(void);
void LockForRead(void);
void UnLockForRead(void);
void LockForWrite(void);
void UnLockForWrite(void);
private:
long readerCount;
CRITICAL_SECTION critical_section;
CRITICAL_SECTION reader_all_leave;
};
#include"stdafx.h"
#include"auto_RWLock.h"
auto_RWLock::auto_RWLock(void):readerCount(0)

{
InitializeCriticalSection(&critical_section);
InitializeCriticalSection(&reader_all_leave);
}
auto_RWLock::~auto_RWLock(void)

{
DeleteCriticalSection(&critical_section);
DeleteCriticalSection(&reader_all_leave);
}
void auto_RWLock::LockForRead(void)

{
EnterCriticalSection(&critical_section);
if(InterlockedIncrement(&readerCount) ==1)
EnterCriticalSection(&reader_all_leave);
LeaveCriticalSection(&critical_section);
}
void auto_RWLock::UnLockForRead(void)

{
if(InterlockedDecrement(&readerCount)==0)
LeaveCriticalSection(&reader_all_leave);
}
void auto_RWLock::LockForWrite(void)

{
EnterCriticalSection(&critical_section);
EnterCriticalSection(&reader_all_leave);
}
void auto_RWLock::UnLockForWrite(void)

{
LeaveCriticalSection(&critical_section);
LeaveCriticalSection(&reader_all_leave);
}