看过网上一些读写锁的实现,感觉实现都比较麻烦,我想想这个应该不是特别麻烦的事,主要就是考虑如何实现写加锁,于是就动手写了一个,没有使用事件等内核级的对象,只使用了临界区和InterLock函数。目的很简单,就是读操作尽快释放对读锁的占用。下面是代码实现:
#include <windows.h>
class CReadWriteLock
{
public:
CReadWriteLock(void);
~CReadWriteLock(void);
bool ReadLock();
bool ReadUnlock();
bool WriteLock();
bool WriteUnlock();
private:
LONG mdwReaders;
CRITICAL_SECTION mEnterLock;
};
/***************************************************
CReadWriteLock::CReadWriteLock(void)
构造函数
*****************************************************/
inline CReadWriteLock::CReadWriteLock(void)
{
InitializeCriticalSection(&mEnterLock);
mdwReaders = 0;
#ifdef DEBUG
std::cout<<"Create ReadWriteLock"<<endl;
#endif //DEBUG
}
/***************************************************
CReadWriteLock::~CReadWriteLock(void)
析构函数
*****************************************************/
inline CReadWriteLock::~CReadWriteLock(void)
{
DeleteCriticalSection(&mEnterLock);
#ifdef DEBUG
std::cout<<"Delete ReadWriteLock"<<endl;
#endif //DEBUG
}
/***************************************************
CReadWriteLock::ReadLock()
读加锁
返回植:true 锁定成功
false 锁定失败
*****************************************************/
inline bool CReadWriteLock::ReadLock()
{
EnterCriticalSection(&mEnterLock);
InterlockedIncrement(&mdwReaders);
LeaveCriticalSection(&mEnterLock);
#ifdef DEBUG
std::cout<<"Reader lock success."<<endl;
#endif //DEBUG
return true;
}
/***************************************************
CReadWriteLock::ReadUnlock()
读开锁
返回植:true 锁定成功
false 锁定失败
*****************************************************/
inline bool CReadWriteLock::ReadUnlock()
{
InterlockedDecrement(&mdwReaders);
#ifdef DEBUG
std::cout<<"Reader unlock success."<<endl;
#endif //DEBUG
return true;
}
/***************************************************
CReadWriteLock::WriteLock()
写加锁
返回植:true 锁定成功
false 锁定失败
*****************************************************/
inline bool CReadWriteLock::WriteLock()
{
EnterCriticalSection(&mEnterLock);
while(mdwReaders>0)
{
#ifdef DEBUG
std::cout<<"Writer lock test Reader number."<<endl;
std::cout<<"Current Reader number is "<<mdwReaders<<endl;
#endif //DEBUG
Sleep(1);
}
#ifdef DEBUG
std::cout<<"Writer lock success."<<endl;
#endif //DEBUG
return true;
}
/***************************************************
CReadWriteLock::WriteUnlock()
写解锁
返回植:true 锁定成功
false 锁定失败
*****************************************************/
inline bool CReadWriteLock::WriteUnlock()
{
LeaveCriticalSection(&mEnterLock);
#ifdef DEBUG
std::cout<<"Writer unlock success."<<endl;
#endif //DEBUG
return true;
}