Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 读写器同步-公平版本中释放锁的顺序_Multithreading_Concurrency_Synchronization_Theory - Fatal编程技术网

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
    ,然后再释放
    serviceQueue
    ,则下一个读卡器可以不早于时间3获取
    serviceQueue
    互斥锁。因此,最早可以在时间6完成读锁注册仪式。这里的受益方将是等待退出的其他读者,他们不那么重要,因为他们不应该也能够发布
    resourceAccess
    (因为我们最初的读者刚刚注册)

  • 另一方面,如果首先释放
    serviceQueue
    ,然后释放
    readCountAccess
    ,则下一个读卡器最早可以在时间2获取
    serviceQueue
    互斥锁。这意味着最早可以在时间5通过读锁注册仪式完成

尽管如此,我还是更倾向于使用对称方案解锁——它不太容易出错,它有更广泛的认可度,并且证明目前它在任何方面都比上述版本更糟糕的责任将落在怀疑者的肩上