</pre><pre name="code" class="html">#pragma once
class CReadWriteLock
{
public:
CReadWriteLock(void);
~CReadWriteLock(void);
void ReadLock();
void ReadUnlock();
void WriteLock();
void WriteUnlock();
private:
HANDLE readEvent;
HANDLE writeEvent;
HANDLE writeMutex;
HANDLE readNumMutex;
HANDLE lockMutex;
volatile unsigned long readNum;
};
#include "StdAfx.h"
#include "ReadWriteLock.h"
CReadWriteLock::CReadWriteLock(void)
{
readEvent = CreateEvent(NULL, true, true, NULL);
writeEvent = CreateEvent(NULL, true, true, NULL);
writeMutex = CreateMutex(NULL, false, NULL);
readNumMutex = CreateMutex(NULL, false, NULL);
lockMutex = CreateMutex(NULL, false, NULL);
readNum = 0;
}
CReadWriteLock::~CReadWriteLock(void)
{
CloseHandle(readEvent);
CloseHandle(writeEvent);
CloseHandle(writeMutex);
CloseHandle(readNumMutex);
CloseHandle(lockMutex);
}
void CReadWriteLock::ReadLock()
{
WaitForSingleObject(lockMutex, INFINITE);
WaitForSingleObject(readEvent, INFINITE);
WaitForSingleObject(readNumMutex, INFINITE);
if(readNum == 0)
{
ResetEvent(writeEvent);
}
readNum++;
ReleaseMutex(readNumMutex);
ReleaseMutex(lockMutex);
}
void CReadWriteLock::ReadUnlock()
{
WaitForSingleObject(readNumMutex, INFINITE);
readNum--;
if(readNum == 0)
{
SetEvent(writeEvent);
}
ReleaseMutex(readNumMutex);
}
void CReadWriteLock::WriteLock()
{
WaitForSingleObject(writeMutex, INFINITE);
WaitForSingleObject(lockMutex, INFINITE);
ResetEvent(readEvent);
WaitForSingleObject(writeEvent, INFINITE);
ReleaseMutex(lockMutex);
}
void CReadWriteLock::WriteUnlock()
{
SetEvent(readEvent);
ReleaseMutex(writeMutex);
}