/** @file CWRGuard.h
* @note
* @brief 读写锁
*
* @author Jlzlight
* @date 2017-9-27
*
* @note
* @note 历史记录:
* @note V1.0.0
*
* @warning
*/
/*
读写锁的特点如下:
1)如果有其它线程读数据,则允许其它线程执行读操作,但不允许写操作。
2)如果有其它线程写数据,则其它线程都不允许读、写操作。
读写锁分为读锁和写锁,规则如下:
1)如果某线程申请了读锁,其它线程可以再申请读锁,但不能申请写锁。
2)如果某线程申请了写锁,其它线程不能申请读锁,也不能申请写锁。
*/
#pragma once
#include <windows.h>
class SyncObject
{
public:
SyncObject(void);
~SyncObject(void);
void ReadLock();
void unReadLock();
void WriteLock();
void unWriteLock();
private:
SyncObject(const SyncObject& syncObject);
SyncObject& operator = (const SyncObject& syncObject);
private:
SRWLOCK m_srwLock;
};
inline SyncObject::SyncObject(void)
{
InitializeSRWLock(&m_srwLock);
}
inline SyncObject::~SyncObject(void)
{
//system release
}
inline void SyncObject::ReadLock()
{
AcquireSRWLockShared(&m_srwLock);
}
inline void SyncObject::unReadLock()
{
ReleaseSRWLockShared(&m_srwLock);
}
inline void SyncObject::WriteLock()
{
AcquireSRWLockExclusive(&m_srwLock);
}
inline void SyncObject::unWriteLock()
{
ReleaseSRWLockExclusive(&m_srwLock);
}
class CRWGuard
{
public:
// true read lock / false write lock
explicit CRWGuard(SyncObject* pscLock, bool isReadLock = true);
~CRWGuard(void);
private:
CRWGuard(const CRWGuard& syncObject);
CRWGuard& operator = (const CRWGuard& syncObject);
private:
SyncObject* m_pcsLock;
bool m_bIsReadLock;
};
inline CRWGuard::~CRWGuard(void)
{
try
{
if (NULL != m_pcsLock)
{
if(m_bIsReadLock)
{
m_pcsLock->unReadLock();
}
else
{
m_pcsLock->unWriteLock();
}
}
}
catch (...)
{
}
}
inline CRWGuard::CRWGuard(SyncObject* pscLock, bool isReadLock)
: m_pcsLock(pscLock)
, m_bIsReadLock(isReadLock)
{
if (NULL != m_pcsLock)
{
if(m_bIsReadLock)
{
m_pcsLock->ReadLock();
}
else
{
m_pcsLock->WriteLock();
}
}
}
windows读写锁
最新推荐文章于 2019-08-12 20:12:32 发布