Win32经典代码:用关键段实现读写锁

class CReadWriteSection { public: CReadWriteSection() { InitializeCriticalSection(&_csEnterRead); InitializeCriticalSection(&_csWriter); _lReaders = -1; } ~CReadWriteSection() { DeleteCriticalSection(&_csEnterRead); DeleteCriticalSection(&_csWriter); } void EnterRead() { EnterCriticalSection(&_csEnterRead); if (!InterlockedIncrement(&_lReaders)) EnterCriticalSection(&_csWriter); LeaveCriticalSection(&_csEnterRead); } void LeaveRead() { if (InterlockedDecrement(&_lReaders)<0) LeaveCriticalSection(&_csWriter); } void EnterWrite() { EnterCriticalSection(&_csEnterRead); EnterCriticalSection(&_csWriter); } void LeaveWrite() { LeaveCriticalSection(&_csWriter); LeaveCriticalSection(&_csEnterRead); } // Note that readers will continue reading underneath this critical section CRITICAL_SECTION *GetPcs() { return &_csEnterRead; } private: CRITICAL_SECTION _csEnterRead; CRITICAL_SECTION _csWriter; LONG _lReaders; }; class CReadLock { public: CReadLock(CReadWriteSection & crws) { (_prws = &crws)->EnterRead(); } ~CReadLock() { _prws->LeaveRead(); } private: CReadWriteSection * _prws; }; class CWriteLock { public: CWriteLock(CReadWriteSection & crws) { (_prws = &crws)->EnterWrite(); } ~CWriteLock() { _prws->LeaveWrite(); } private: CReadWriteSection * _prws; }; #define LOCK_READ(crws) CReadLock crws##_readlock(crws) #define LOCK_WRITE(crws) CWriteLock crws##_writelock(crws)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值