一个Windows下C++读写锁的代码,实现共享读,独占写

// 一个Windows下C++读写锁的代码,实现共享读,独占写

class ReadWriteLock
{
public:
int m_currentLevel;
int m_readCount;
HANDLE m_unlockEvent;
HANDLE m_accessMutex;
CRITICAL_SECTION m_csStateChange;
public:
ReadWriteLock()
{
       m_currentLevel = LOCK_LEVEL_NONE;
       m_readCount = 0;
       m_unlockEvent   = ::CreateEvent( NULL, TRUE, FALSE, NULL );
       m_accessMutex   = ::CreateMutex( NULL, FALSE, NULL );
       ::InitializeCriticalSection( &m_csStateChange );
}
~ReadWriteLock()
{
       ::DeleteCriticalSection( &m_csStateChange );
       if ( m_accessMutex ) ::CloseHandle( m_accessMutex );
       if ( m_unlockEvent ) ::CloseHandle( m_unlockEvent );
}

bool lock( int level, int timeout = INFINITE)
{
       bool   bresult = true;
       DWORD waitResult = 0;
      
       waitResult = ::WaitForSingleObject( m_accessMutex, timeout );
       if ( waitResult != WAIT_OBJECT_0 )   return false;

       if ( level == LOCK_LEVEL_READ && m_currentLevel != LOCK_LEVEL_WRITE )
       {
         ::EnterCriticalSection( &m_csStateChange );
         m_currentLevel = level;
         m_readCount += 1;
         ::ResetEvent( m_unlockEvent );
         ::LeaveCriticalSection( &m_csStateChange );
       }
       else if ( level == LOCK_LEVEL_READ &&
               m_currentLevel == LOCK_LEVEL_WRITE )
       {
         waitResult = ::WaitForSingleObject( m_unlockEvent, timeout );
         if ( waitResult == WAIT_OBJECT_0 )
         {
            ::EnterCriticalSection( &m_csStateChange );
            m_currentLevel = level;
            m_readCount += 1;
            ::ResetEvent( m_unlockEvent );
            ::LeaveCriticalSection( &m_csStateChange );
         }
         else bresult = false;
       }
       else if ( level == LOCK_LEVEL_WRITE &&
               m_currentLevel == LOCK_LEVEL_NONE )
       {
         ::EnterCriticalSection( &m_csStateChange );
         m_currentLevel = level;
         ::ResetEvent( m_unlockEvent );
         ::LeaveCriticalSection( &m_csStateChange );
       }
       else if ( level == LOCK_LEVEL_WRITE &&
               m_currentLevel != LOCK_LEVEL_NONE )
       {
         waitResult = ::WaitForSingleObject( m_unlockEvent, timeout );
         if ( waitResult == WAIT_OBJECT_0 )
         {
            ::EnterCriticalSection( &m_csStateChange );
            m_currentLevel = level;
            ::ResetEvent( m_unlockEvent );
            ::LeaveCriticalSection( &m_csStateChange );
         }
         else bresult = false;
       }

       ::ReleaseMutex( m_accessMutex );
       return bresult;

} // lock()

bool unlock()
{
       ::EnterCriticalSection( &m_csStateChange );
       if ( m_currentLevel == LOCK_LEVEL_READ )
       {
         m_readCount --;
         if ( m_readCount == 0 )
         {
            m_currentLevel = LOCK_LEVEL_NONE;
            ::SetEvent (m_unlockEvent);
         }
       }
       else if ( m_currentLevel == LOCK_LEVEL_WRITE )
       {
         m_currentLevel = LOCK_LEVEL_NONE;
         ::SetEvent ( m_unlockEvent );
       }
       ::LeaveCriticalSection( &m_csStateChange );

       return true;
}
}; 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值