// 一个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;
}
};
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/luckysym/archive/2007/06/29/1671731.aspx
没有合适的资源?快使用搜索试试~ 我知道了~
读写锁,共享读,独占写
共3个文件
h:1个
cpp:1个
txt:1个
需积分: 16 23 下载量 133 浏览量
2010-07-14
17:45:08
上传
评论
收藏 2KB RAR 举报
温馨提示
一次只有一个线程可以占有写模式的读写锁, 但是可以有多个线程同时占有读模式的读写锁. 正是因为这个特性, 当读写锁是写加锁状态时, 在这个锁被解锁之前, 所有试图对这个锁加锁的线程都会被阻塞. 当读写锁在读加锁状态时, 所有试图以读模式对它进行加锁的线程都可以得到访问权, 但是如果线程希望以写模式对此锁进行加锁, 它必须阻塞知道所有的线程释放锁. 通常, 当读写锁处于读模式锁住状态时, 如果有另外线程试图以写模式加锁, 读写锁通常会阻塞随后的读模式锁请求, 这样可以避免读模式锁长期占用, 而等待的写模式锁请求长期阻塞.
资源推荐
资源详情
资源评论
收起资源包目录
读写锁.rar (3个子文件)
读写锁
RWLock.cpp 3KB
新建 文本文档.txt 4KB
RWLock.h 1KB
共 3 条
- 1
资源评论
kathywang
- 粉丝: 1
- 资源: 29
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功