一种读者优先的读写锁的实现
来源:互联网 发布:淘宝各行业退货率 编辑:程序博客网 时间:2024/06/06 16:32
所谓读写锁,就是同一时间允许有多个线程读,但是一旦写者要写,那么在写的过程中别的线程就不允许读写。
但是当写者在申请写锁时,可能有读者正在读,这时不同的读写锁有不同的表现,有下面几种。
读者优先:只要有读者要读,写者就不能写,如果前面的读者还没走就来了新的读者,那么新的读者又会读,所以写者可能饿死。
写者优先:写者一到就开始写,即使这时还有读者没读完。当写者写完后,以前的读者需要重新读。
读写公平:之前的读者读完后,写者开始写;写者写完后,后面的读者才开始读。
这篇文章的主题是读者优先,直接看伪代码:
这里用两个互斥锁实现了读写锁,实现的过程中可以清楚的看到:没有读者时,写者才能上锁。换句话说,如果一直都有读者,那么写者就饿死了。
这里写的是伪代码,因为第一个读者会上写锁,最后一个读者释放写锁,那么调用lock()和unlock()的可能不是同一个线程,这样的用法std::mutex是不支持的,但是可以很容易地把伪代码改写成用condition_variable或者spinlock来实现。
但是当写者在申请写锁时,可能有读者正在读,这时不同的读写锁有不同的表现,有下面几种。
读者优先:只要有读者要读,写者就不能写,如果前面的读者还没走就来了新的读者,那么新的读者又会读,所以写者可能饿死。
写者优先:写者一到就开始写,即使这时还有读者没读完。当写者写完后,以前的读者需要重新读。
读写公平:之前的读者读完后,写者开始写;写者写完后,后面的读者才开始读。
这篇文章的主题是读者优先,直接看伪代码:
class RWLock {public: RWLock() : mCount() { } void readLock() { lock_guard<MyLock> lk(mClassLock); if (mCount == 0) { mWriteLock.lock(); } ++mCount; } void readUnlock() { lock_guard<MyLock> lk(mClassLock); --mCount; if (mCount == 0) { mWriteLock.unlock(); } } void writeLock() { mWriteLock.lock(); assert(mCount == 0); } void writeUnlock() { assert(mCount == 0); mWriteLock.unlock(); }private: MyLock mClassLock; MyLock mWriteLock; size_t mCount;};
这里用两个互斥锁实现了读写锁,实现的过程中可以清楚的看到:没有读者时,写者才能上锁。换句话说,如果一直都有读者,那么写者就饿死了。
这里写的是伪代码,因为第一个读者会上写锁,最后一个读者释放写锁,那么调用lock()和unlock()的可能不是同一个线程,这样的用法std::mutex是不支持的,但是可以很容易地把伪代码改写成用condition_variable或者spinlock来实现。
0 0
- 一种读者优先的读写锁的实现
- 优先队列的一种实现
- 一个写优先的读写锁实现
- “读者-写者问题”的写者优先算法实现
- 读者-写着问题中写者优先的实现
- 读者-写者同步问题的写者优先实现
- 优先读者的读者/写者问题的算法设计
- 利用信号实现写优先的读写锁
- 使用sdl接口实现的读写锁,非写优先
- c++11实现写优先的读写锁
- c++11实现写优先的读写锁
- 一种读写公平的读写锁
- 读写锁(Read-Write Lock)的一种实现
- 一种可并发读写的队列实现
- 操作系统的优先读者和优先写着的读者/写着问题
- 操作系统的优先读者和优先写着的读者/写着问题
- 读者写者问题--使用信号量的读者优先与写者优先程序分析
- 读者写者问题--使用信号量的读者优先与写者优先程序分析
- Linux下OpenOffice转换Office为PDF的java实现
- iOS中利用 runtime 一键改变字体
- [疯狂Java]集合:Set、HashSet、LinkedHashSet
- 新建一个Xtext工程
- CentOS6.5安装Redis2.8.19 和php redis扩展
- 一种读者优先的读写锁的实现
- android:1.6到6.0系统源码
- ACM常用数学公式汇总
- 最常用的Notepad++的快捷键
- Maven中的dependencyManagement
- Android操作Exif-ExifInterface全解析
- Java入门-基础概念
- window.onload和$(function(){})区别
- Uva 11019 Matrix Matcher(二维字符串匹配)