读者/作者同步 - 在公平版本中释放锁定的顺序

时间:2016-04-18 18:35:59

标签: multithreading concurrency synchronization theory

我正在经历the completely fair solution to the Readers/Writers problem,释放锁的顺序似乎让我感到困惑。我想知道我们是否可以在>>> df2.groupby(level=0).UserID.count() Day 1 3 2 2 3 1 Name: UserID, dtype: int64 函数中交换释放serviceQueue锁定和readCountAccess锁定的顺序。如果订单无关紧要,以这种方式释放锁似乎是违反直觉的。但我不知道以相反的顺序释放锁定有什么问题(首先reader()然后然后然后readCountAccess锁定。

1 个答案:

答案 0 :(得分:1)

这可能是你可以证明第一次释放更广泛的锁定(在这种情况下是serviceQueue)的时候的残余,如果这不影响正确性,因为另一个线程可以立即继续获取它释放更狭窄的锁。

想象一下,每次获取或释放需要1个时间单位,每个其他操作需要0个时间单位,读者只是在时间0递增读取器计数器,并且服务等待队列中还有另一个读取器。

  • 如果readCountAccess先发布serviceQueue秒,serviceQueue秒,下一个读者可以在不早于时间3的情况下获取resourceAccess互斥。因此最早可以使用读锁定登记仪式是在第6时间。这里的受益方将是其他读者等待退出,并且它们不那么重要,因为它们不应该也能释放serviceQueue(因为我们的原始读者只是注册为)。

  • 如果另一方面readCountAccess首先发布serviceQueue秒,那么下一个读者最早可以在时间2获取var myQuery = (from l in db.MyTable select l); myQuery.Where(r => availableStatusList.Contains(r.Status)); var myObj = myQuery.ToList(); 互斥量。这意味着它早在5时就可以通过阅读锁定登记仪式完成。

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