使用Windows提供的互斥体和事件体来实现读写锁。CreateMutex,CreateEvent,WaitForSingleObject,WaitForMultipleObjects,ResetEvent,SetEvent,ReleaseMutex,CloseHandle,不熟悉这组API的童鞋可以边看代码边查。
RWLockImpl.h
#ifndef _RWLockImpl_Header
#define _RWLockImpl_Header
#include <assert.h>
#include <iostream>
#include <Windows.h>
#include <process.h>
using namespace std;
/*
读写锁允许当前的多个读用户访问保护资源,但只允许一个写读者访问保护资源
*/
//-----------------------------------------------------------------
class CRWLockImpl
{
protected:
CRWLockImpl();
~CRWLockImpl();
void ReadLockImpl();
bool TryReadLockImpl();
void WriteLockImpl();
bool TryWriteLockImpl();
void UnlockImpl();
private:
void AddWriter();
void RemoveWriter();
DWORD TryReadLockOnce();
HANDLE m_mutex;
HANDLE m_readEvent;
HANDLE m_writeEvent;
unsigned m_readers;
unsigned m_writersWaiting;
unsigned m_writers;
};
//-----------------------------------------------------------------
class CMyRWLock: private CRWLockImpl
{
public:
//创建读/写锁
CMyRWLock(){};
//销毁读/写锁
~CMyRWLock(){};
//获取读锁
//如果其它一个线程占有写锁,则当前线程必须等待写锁被释放,才能对保护资源进行访问
void ReadLock();
//尝试获取一个读锁
//如果获取成功,则立即返回true,否则当另一个线程占有写锁,则返回false
bool TryReadLock();