#ifndef __RW_LOCK_H__
#define __RW_LOCK_H__
#include <windows.h>
/*************************************************************************
*** file: RWLock.h
*** Reference:
*** http://bbs.csdn.net/topics/390331427?page=1
*************************************************************************/
class CRWLock
{
public:
CRWLock(): m_readCount(0), m_writeCount(0) { ::InitializeCriticalSection(&mtx); }
~CRWLock() { ::DeleteCriticalSection(&mtx); }
void ReadLock()
{
while(true)
{
if(!m_writeCount)
{
::InterlockedIncrement((volatile long*)&m_readCount);
if(m_writeCount)
{
// 有读写冲突,让位于写
::InterlockedDecrement((volatile long*)&m_readCount);
continue;
}
//获得读锁
break;
}
::Sleep(0);
}
}
void ReadUnlock() { ::InterlockedDecrement((volatile long*)&m_readCount); }
void WriteLock()
{
::InterlockedIncrement((volatile long*)&m_writeCount);
::EnterCriticalSection(&mtx);
// 等待已经在读的线程结束读操作
while(true)
{
if(!m_readCount)
break;
::Sleep(0);
}
}
void WriteUnlock()
{
::LeaveCriticalSection(&mtx);
::InterlockedDecrement((volatile long*)&m_writeCount);
}
private:
CRWLock(const CRWLock &);
CRWLock & operator = (const CRWLock &);
CRITICAL_SECTION mtx;
int m_readCount;
int m_writeCount;
};
#endif // !__RW_LOCK_H__
一个Windows C++ 读写锁的实现
最新推荐文章于 2025-06-01 19:23:25 发布
本文介绍了一个RW锁(读写锁)的实现方式,该锁通过Windows平台的临界区来实现互斥访问,并采用原子操作来计数当前有多少读取者和写入者。当有写入者时,会阻止新的读者进入,直到写入完成。

3817

被折叠的 条评论
为什么被折叠?



