windows读写锁

来源:互联网 发布:linux查找文件路径命令 编辑:程序博客网 时间:2024/06/13 02:50
/**@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 lockexplicit 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();}}}