![]() |
登录 用户中心() [退出] 后台管理 注册 |
热门搜索: |
您的位置:首页 >> 马上代码 >> 马上代码 >> 主题: 两个普通锁实现的多读单写锁 |
标题 | 两个普通锁实现的多读单写锁 |
clq |
浏览(2042)
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 发表
编辑
还是不行,一个线程应该是无法释放另外一个线程的锁的。 |
Copyright © 2005-2012 CLQ工作室, All Rights Reserved CLQ工作室 版权所有 |