2016-04-18 20 views
1

我正在通过the completely fair solution to the Readers/Writers problem,释放锁的顺序似乎让我感到困惑。我想知道我们是否可以在reader()函数中交换释放serviceQueue锁和readCountAccess锁的顺序。如果顺序无关紧要,以这种方式释放锁看起来是违反直觉的。但我没有看到以相反的顺序释放锁定有什么问题(首先,readCountAccess,然后,然后serviceQueue锁定)。读者/作家同步 - 释放锁公平版本的顺序

回答

1

这可能是一个剩余时间,如果这不会影响正确性,那么您可以首先释放更大的锁(在这种情况下为serviceQueue),因为另一个线程可以在释放更多时立即继续获取它窄锁。假设每个获取或释放需要1个时间单位,每个其他操作需要0个时间单位,读者只是在时间0时递增读取器计数器,并且在服务等待队列中还有另一个读取器在线。

  • 如果readCountAccess被释放第一和serviceQueue秒,接下来的读者可能会不早于时间获取serviceQueue互斥。因此它可以与读锁注册仪式来完成最早是在时间6。这里的受益方将是其他读者等待退出,并且他们不那么重要,因为他们不应该也能够发布resourceAccess(因为我们原来的读者已经注册了)。

  • 如果另一方面serviceQueue被释放第一和readCountAccess秒,接下来的读者可以在时间2早获得serviceQueue互斥这意味着它可以与读锁注册仪式,早在做时间5

我还是更喜欢使用对称方案虽然解锁 - 这是容易出错少,它具有更广泛的认识,并举证,目前以任何方式更糟糕的是比版本以上将落在怀疑者的肩上。