windows读写锁实现
来源:互联网 发布:蓝鸥学校java培训 编辑:程序博客网 时间:2024/06/05 05:00
#define RWLOCK_IDLE 0
#define RWLOCK_R 0x01
#define RWLOCK_W 0x02
class RWLock
{
private:
int _st;
int _rlockCount;
int _rwaitingCount;
int _wwaitingCount;
HANDLE _ev;
//HANDLE _stLock;
CRITICAL_SECTION _stLock;
public:
RWLock(void);
~RWLock(void);
void rlock();
void wlock();
void unlock();
};
RWLock::RWLock(void)
: _rlockCount(0),
_st(RWLOCK_IDLE),
_rwaitingCount(0),
_wwaitingCount(0)
{
InitializeCriticalSection(&_stLock);
_ev = CreateEvent(NULL, TRUE, FALSE, NULL); //创建一个无名的不能被继承的无信号状态的事件对象,必须用ResetEvent函数来手工将事件的状态复原到无信号状态
assert(_ev != INVALID_HANDLE_VALUE);
}
RWLock::~RWLock(void)
{
//CloseHandle(_stLock);
DeleteCriticalSection(&_stLock);
CloseHandle(_ev);
}
void RWLock::rlock()
{
bool isWaitReturn = false;
while(1)
{
//WaitForSingleObject(_stLock, INFINITE);
EnterCriticalSection(&_stLock);
if(isWaitReturn)
{
--_rwaitingCount;
}
if(_st == RWLOCK_IDLE)
{
_st = RWLOCK_R; //初始化状态,直接加读锁
_rlockCount++;
//ReleaseMutex(_stLock);
LeaveCriticalSection(&_stLock);
break;
}
else if( _st == RWLOCK_R)
{
if(_wwaitingCount > 0) //这样写是模拟锁队列?
{
++_rwaitingCount;
ResetEvent(_ev);
//SignalObjectAndWait(_stLock, _ev, INFINITE, FALSE);
LeaveCriticalSection(&_stLock);
WaitForSingleObject(_ev, INFINITE);
isWaitReturn = true;
}
else
{
++_rlockCount;
//ReleaseMutex(_stLock);
LeaveCriticalSection(&_stLock);
break;
}
}
else if(_st == RWLOCK_W)
{
++_rwaitingCount; //写锁状态,读等待数量自加
ResetEvent(_ev);
//SignalObjectAndWait(_stLock, _ev, INFINITE, FALSE);
LeaveCriticalSection(&_stLock);
WaitForSingleObject(_ev, INFINITE);
isWaitReturn = true;
}
else
{
assert(0);
break;
}
}
}
void RWLock::wlock()
{
bool isWaitReturn = false;
while(1) //循环判断锁释放情况
{
//WaitForSingleObject(_stLock, INFINITE);
EnterCriticalSection(&_stLock); //保护数量和信号
if(isWaitReturn)
{
--_wwaitingCount; //后续有等到锁闲置,写锁先自减
}
if(_st == RWLOCK_IDLE)
{
_st = RWLOCK_W; //抢到写锁,设置锁状态
//ReleaseMutex(_stLock);
LeaveCriticalSection(&_stLock);
break; //结束等待
}
else
{
++_wwaitingCount; //没抢到锁,写锁数量自加
ResetEvent(_ev);
//SignalObjectAndWait(_stLock, _ev, INFINITE, FALSE);
LeaveCriticalSection(&_stLock);
WaitForSingleObject(_ev, INFINITE);
isWaitReturn = true;
}
}
}
void RWLock::unlock()
{
//WaitForSingleObject(_stLock, INFINITE);
EnterCriticalSection(&_stLock);
if(_rlockCount > 0)
{
//如果读锁数量还有,解锁将直接自减读数
--_rlockCount;
if( 0 == _rlockCount)
{
//如果解锁后,读数自减到0,则初始化锁状态为闲置
_st = RWLOCK_IDLE;
if( _wwaitingCount > 0 || _rwaitingCount > 0 )
{
SetEvent(_ev); //锁初始化为闲置时,如果有读写锁等待,则发信号通知
}
}
}
else
{
_st = RWLOCK_IDLE; //如果没有读锁,解锁将直接初始化锁状态为闲置
if( _wwaitingCount > 0 || _rwaitingCount > 0 )
{
SetEvent(_ev);//锁初始化为闲置时,如果有读写锁等待,则发信号通知
}
}
//ReleaseMutex(_stLock);
LeaveCriticalSection(&_stLock);
}
阅读全文
0 0
- windows读写锁实现
- 在Windows实现C++锁的读写
- WINDOWS读写锁的简单实现
- 一个Windows C++ 读写锁的实现
- windows信号量实现读写同步
- 一个简单的读写锁的实现(WINDOWS平台)
- WINDOWS下读写锁
- WINDOWS下读写锁
- windows读写锁
- Windows下条件变量实现读写同步
- Windows下C++读写锁
- Windows下C++读写锁
- Windows 平台之读写锁
- Windows下的读写锁
- Windows内核中的读写锁
- Win32 实现读写锁
- 读写锁的实现!
- 读写锁实现
- TCP重传分析
- hdu 5912 Fraction
- vue-elementUI 弹出框
- log4j日志文件配置
- c++primer plus阅读笔记(一)
- windows读写锁实现
- 线程池简介
- 前端国际化,用jquery.i18n完成中英文切换
- leetcode 124. Binary Tree Maximum Path Sum 最大路径和 + DFS深度优先搜索
- at javax.swing.ImageIcon.<init>(Unknown Source)
- JsonHelper 操作帮助类
- redis的哨兵集群模式
- [Android Exercise]Fragment新闻客户端例子拆解PART.2—带你记忆Fragment的使用
- 【JPA 级联保存/级联删除】@OneToMany 一对多(单向和双向)注解