Readers/Writers synchronization - 公平版本中释放锁的顺序

Readers/Writers synchronization - order of releasing locks in fair version

我正在经历 the completely fair solution to the Readers/Writers problem,释放锁的顺序让我感到困惑。我想知道我们是否可以交换reader()函数中释放serviceQueue锁和readCountAccess锁的顺序。如果顺序无关紧要,以这种方式释放锁似乎违反直觉。但是我看不出以相反的顺序释放锁有什么问题(首先 readCountAccess 然后 然后 serviceQueue 锁)。

如果不影响正确性,这可能是您可以证明首先释放更广泛的锁(在本例中 serviceQueue)的日子的残余,因为另一个线程可以立即继续获取它,同时你正在释放更窄的锁。

假设每个获取或释放占用 1 个时间单位,每个其他操作占用 0 个时间单位,一个 reader 只是在时间 0 增加了 reader 计数器,还有另一个 reader 服务等待队列中的下一个。

  • 如果先释放 readCountAccess,然后释放 serviceQueue,则下一个 reader 可以不早于时间 3 获取 serviceQueue 互斥锁。因此读锁注册仪式最早可以在时间 6 完成。这里的受益方将是其他 reader 等待退出,他们不太重要,因为他们不应该也发布 resourceAccess(因为我们原来的 reader 刚刚注册了)。

  • 如果另一方面 serviceQueue 首先释放 readCountAccess 第二,下一个 reader 可以获得 serviceQueue 互斥量在时间2。这意味着它可以早在时间5就可以完成读锁注册仪式。

虽然我仍然更喜欢使用对称方案解锁 - 它更不容易出错,它有更广泛的认可,并且证明目前它在任何方面都比上面的版本更糟糕的责任在于怀疑者的肩膀。