读写锁实现疑问:为何需要两个mutex而非一个?
读写锁的单mutex实现疑问解答
你的读写锁核心规则理解完全正确
- 同一时刻只能有一个写操作执行
- 写操作执行时不能有读操作进行
- 多个读操作可以并发执行
为什么单mutex实现不了正确的读写锁
你设想的单mutex实现存在核心问题:无法区分读操作的并发权限。
你的读操作逻辑里,wait(write_lock)会让所有读请求都阻塞在同一个锁上,相当于把读操作也变成了串行执行——同一时刻只能有一个读操作在运行,完全失去了读写锁允许多读并发的核心优势。
你提供的代码问题分析
写操作代码
// wait until no one is reading concurrently if (wait(write_lock)) { acquire(write_lock) // Do the write operation release(write_lock) }
这里的逻辑没处理读计数:你没法知道当前有多少个读操作在运行,wait(write_lock)只能判断锁是否被持有,无法等待所有读操作完成后再获取写锁,会出现写操作和读操作同时运行的情况,违反读写互斥的规则。
读操作代码
// wait until no one is currently writing if (wait(write_lock)) { // Do the read operation atomically }
这里的wait(write_lock)本质是让所有读请求串行化——每个读操作都要等前一个(不管是读还是写)释放锁才能执行,完全做不到多读读并发,和普通mutex的效果没区别。
为什么需要两个mutex?
双mutex的典型实现逻辑是:用一个mutex保护读计数变量,另一个mutex作为写锁:
- 读操作时,先获取读计数的mutex,递增读计数;如果是第一个读操作,就获取写锁;然后释放读计数mutex,执行读操作;读完后再次获取读计数mutex,递减读计数,最后一个读操作释放写锁。
- 写操作时,直接获取写锁,执行写操作后释放。
这种设计既能保证写操作独占,又能让多个读操作并发执行,同时避免读写冲突。
内容的提问来源于stack exchange,提问作者Node.JS
相关产品推荐
相关产品推荐

