登录 用户中心() [退出] 后台管理 注册
 

热门搜索:
您的位置:首页 >> 马上代码 >> 马上代码 >> 主题: 两个普通锁实现的多读单写锁
标题 两个普通锁实现的多读单写锁
clq
浏览(1688) 2008-03-17 15:29:38 发表 编辑

关键字:

两个普通锁实现的多读单写锁

不成熟的多版本演进 :)
--------------------------------------------------

#ifndef _LOCK_RW_H_
#define _LOCK_RW_H_

//读写锁定的实现//对于很多数据只要初始化的时候需要锁定,其余时间是只要读取的,所以有必要实现一个//新写的,尽量少用

#include "os.h"
#include "thread_lock.h"

class LockRW
{
public:
LockRW();
~LockRW();

private:
//必须由两层锁来实现
thread_lock m_LockLevel1;//这个只是为了保护各个变量的读写同步
thread_lock m_LockLevel2;

int m_iReadCount;
bool m_bHaveWrite;//有写请求在锁定队列中

public:
//读锁
void LockForRead();
void UnLockForRead();
//写锁
void LockForWrite();
void UnLockForWrite();

};

#endif

--------------------------------------------------

#include "os.h"
#include "thread_lock.h"
#include "lock_rw.h"
#include

//原理:当有读线程1时锁定 level1 锁定,发现是第一个读取的时候还要锁 level2. 最后释放 level1 锁定
//当有读线程2时与上类似,但不锁定 level2 锁,只是读计数器加 1
//读取线程全部离开后才释放 level2 ,但是这样写锁就太靠后了,应该是当处理写状态时也要锁定 level2 然后才加记数器
//读取锁离开时只有在记数为 0 时才放开锁定
//其实就是读线程如何判断什么时候放开 level2 锁的问题,level1 只是为了使这个判断不会有线程访问问题而已

LockRW::LockRW()
{
m_iReadCount = 0;
m_bHaveWrite = false;//level2 现在是被写锁锁定了,这个时候读线程必须也要去锁定 level2 锁定以等待写锁
}

LockRW::~LockRW()
{}


//读锁
void LockRW::LockForRead()
{
printf("m_LockLevel1.lock()\r\n");
m_LockLevel1.lock();
printf("m_LockLevel1.lock() ok\r\n");

//如果有写锁时也要锁定 level2 锁,目的是等待//也正因为只是等待,所以锁定完后马上放开
if (m_bHaveWrite == true)
{
//m_LockLevel1.unlock();

printf("m_LockLevel2.lock()\r\n");
m_LockLevel2.lock();
printf("m_LockLevel2.lock() ok\r\n");
m_LockLevel2.unlock();

//m_LockLevel1.lock();
}

//当没有其他读锁时,要自己锁定 level2 锁,目的是让写锁等待自己处理完后
if (m_iReadCount == 0)
{
m_iReadCount++;
m_LockLevel1.unlock();

printf("m_LockLevel2.lock()\r\n");
m_LockLevel2.lock();
printf("m_LockLevel2.lock() ok\r\n");

}
else
{
m_iReadCount++;
m_LockLevel1.unlock();
}

}


void LockRW::UnLockForRead()
{
printf("m_LockLevel1.lock()\r\n");
m_LockLevel1.lock();
printf("m_LockLevel1.lock() ok\r\n");

m_iReadCount--;

//当没有其他读锁时,要自己解锁 level2 锁,目的是让写锁可处理
if (m_iReadCount == 0)
{
m_LockLevel2.unlock();
}

m_LockLevel1.unlock();

}

//写锁
void LockRW::LockForWrite()
{
m_LockLevel1.lock();

m_bHaveWrite = true;//有写请求在锁定队列中 = true;//写者优先的读写锁的设计

m_LockLevel1.unlock();

m_LockLevel2.lock();




}

void LockRW::UnLockForWrite()
{

m_LockLevel1.lock();

m_bHaveWrite = false;

m_LockLevel1.unlock();

m_LockLevel2.unlock();

}



clq
2008-3-17 18:39:28 发表 编辑

还是不行,一个线程应该是无法释放另外一个线程的锁的。

总数:1 页次:1/1 首页 尾页  


发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:




Copyright © 2005-2012 CLQ工作室, All Rights Reserved

CLQ工作室 版权所有