Multithreading 读写器同步-公平版本中释放锁的顺序
我当时正在经历,而释放锁的顺序似乎让我感到困惑。我想知道我们是否可以在Multithreading 读写器同步-公平版本中释放锁的顺序,multithreading,concurrency,synchronization,theory,Multithreading,Concurrency,Synchronization,Theory,我当时正在经历,而释放锁的顺序似乎让我感到困惑。我想知道我们是否可以在reader()函数中交换释放serviceQueue锁和readCountAccess锁的顺序。如果顺序不重要,以这种方式释放锁似乎违反直觉。但我看不出以相反的顺序释放锁有什么错(首先是readCountAccess,然后是serviceQueuelock)。这可能是在不影响正确性的情况下,您可以证明先释放更大的锁(在本例中是serviceQueue)是正确的,因为当您释放更窄的锁时,另一个线程可以立即继续获取它 假设每个获
reader()
函数中交换释放serviceQueue
锁和readCountAccess
锁的顺序。如果顺序不重要,以这种方式释放锁似乎违反直觉。但我看不出以相反的顺序释放锁有什么错(首先是readCountAccess
,然后是serviceQueue
lock)。这可能是在不影响正确性的情况下,您可以证明先释放更大的锁(在本例中是serviceQueue
)是正确的,因为当您释放更窄的锁时,另一个线程可以立即继续获取它
假设每个获取或释放需要1个时间单位,每个其他操作需要0个时间单位,一个读卡器只是在时间0时增加了读卡器计数器,服务等待队列中还有另一个读卡器
- 如果先释放
,然后再释放readCountAccess
,则下一个读卡器可以不早于时间3获取serviceQueue
互斥锁。因此,最早可以在时间6完成读锁注册仪式。这里的受益方将是等待退出的其他读者,他们不那么重要,因为他们不应该也能够发布serviceQueue
(因为我们最初的读者刚刚注册)resourceAccess
- 另一方面,如果首先释放
,然后释放serviceQueue
,则下一个读卡器最早可以在时间2获取readCountAccess
互斥锁。这意味着最早可以在时间5通过读锁注册仪式完成serviceQueue