我正在通过the completely fair solution to the Readers/Writers problem,释放锁的顺序似乎让我感到困惑。我想知道我们是否可以在reader()
函数中交换释放serviceQueue
锁和readCountAccess
锁的顺序。如果顺序无关紧要,以这种方式释放锁看起来是违反直觉的。但我没有看到以相反的顺序释放锁定有什么问题(首先,readCountAccess
和,然后,然后serviceQueue
锁定)。读者/作家同步 - 释放锁公平版本的顺序
1
A
回答
1
这可能是一个剩余时间,如果这不会影响正确性,那么您可以首先释放更大的锁(在这种情况下为serviceQueue
),因为另一个线程可以在释放更多时立即继续获取它窄锁。假设每个获取或释放需要1个时间单位,每个其他操作需要0个时间单位,读者只是在时间0时递增读取器计数器,并且在服务等待队列中还有另一个读取器在线。
如果
readCountAccess
被释放第一和serviceQueue
秒,接下来的读者可能会不早于时间获取serviceQueue
互斥。因此它可以与读锁注册仪式来完成最早是在时间6。这里的受益方将是其他读者等待退出,并且他们不那么重要,因为他们不应该也能够发布resourceAccess
(因为我们原来的读者已经注册了)。如果另一方面
serviceQueue
被释放第一和readCountAccess
秒,接下来的读者可以在时间2早获得serviceQueue
互斥这意味着它可以与读锁注册仪式,早在做时间5
我还是更喜欢使用对称方案虽然解锁 - 这是容易出错少,它具有更广泛的认识,并举证,目前以任何方式更糟糕的是比版本以上将落在怀疑者的肩上。
相关问题
- 1. 关于读者/作家同步
- 2. C读者作家线程锁解锁
- 3. 读者 - 作者同步问题
- 4. 许多读者,一位作家:我需要同步这个吗?
- 5. 一位读者,许多作家
- 6. 同步工件版本与Maven释放过程
- 7. ReentrantReadWriteLock - 为什么读者不能获取作家的锁?
- 8. 操作系统:混乱,使溶液中的第一读者,作家同步问题
- 9. 服务工作者同步或顺序提取
- 10. SynchronizationLockException(对象同步方法从非同步代码块调用。)释放锁时
- 11. 线程同步(锁定),只释放到后进线程
- 12. 同步方法可能不会释放锁
- 13. 如果我从同步块返回,锁何时释放?
- 14. 软件版本更改BinaryReader的顺序
- 15. H2数据库释放锁
- 16. 同步多个阅读器,单个作者?
- 17. 让读者/作家线程进入R/W/R/W
- 18. 行家释放多模块插件,具有不同SCM标签和版本
- 19. 多个读者 - Akka的单人作家
- 20. 线程同步执行操作顺序
- 21. 锁,工艺和释放JDBC
- 22. IDirect3DDevice9释放死锁
- 23. 升级读锁而不释放C++ 11中的第一个锁?
- 24. 不同国家的Playstore版本不同?
- 25. 什么时候读者/作家/流被确定为开放?
- 26. 1作家,男读者消耗相同的项目
- 27. 采集/释放与顺序一致性存储器顺序
- 28. 为什么我的程序的异步版本比同步版本慢?
- 29. System.Collections.Generic.SortedList的同步版本?
- 30. node.js http.get的同步版本