我不理解这位作者解释的饥饿意味着什么

时间:2014-01-13 17:51:45

标签: multithreading

objc.io Issue 2中,作者通过阅​​读和写作讨论了饥饿问题:

  

当你认为有足够的问题需要思考时,一个新问题即将到来。锁定共享资源可能会导致读者编写者出现问题。在许多情况下,将资源的读取访问限制为一次一个访问是浪费的。因此,只要资源上没有写入锁定,就允许读取锁定。在这种情况下,等待获取写锁定的线程可能会因同时发生的更多读锁定而受到限制。

我假设读锁只允许锁定它的东西访问读取值,而其他所有人都无法访问它?我知道如果没有写入锁定(因为值可能正在改变),你只能读取锁定,但是在它使用的方式中,它似乎暗示“只有在没有写入锁定时才允许读取锁定”作为效率的手段/不浪费。读取锁定与浪费有什么关系?

另外,有人可以解释最后一句话的含义吗?我不明白读锁会产生什么影响,或者读取锁甚至会打开什么。

3 个答案:

答案 0 :(得分:3)

基本上它意味着读锁允许其他项同时读取数据。 想象一下下面的场景。

A读取锁定并开始阅读 然后X出现并尝试进行写锁定,但不能,因为它已被锁定 同时,在A完成阅读之前,B出现并进行读锁定。这是允许的,因为读锁可以是并发的 然后,A完成,但X仍然无法写入,因为它被B锁定 然后,在B完成之前,C出现并取出读锁定。等等。

答案 1 :(得分:1)

当您具有“共享读取”和“独占写入”锁定时,会发生此问题。多个“共享读取”锁可以同时应用于实体,它们将阻止任何“独占写”锁获取访问权。

当新的“共享读取”锁在所有现有锁被释放之前继续到达时,会发生“饥饿”。这可以无限期地阻止“独占写”锁。

有几种策略可以解决此问题,例如,如果存在“独占写入”锁等待,则阻止应用任何新的“共享读取”锁。

答案 2 :(得分:0)

1)如果共享资源上只允许一个读锁定,那将是“浪费”,因为任何只想读取共享资源的线程都必须排队并一次读取一个资源。

2)读锁定不会阻止其他线程取出读锁定,但会阻止其他线程进行写锁定。

3)因为你不能写一个锁定一个有一个或多个读锁定的共享资源,如果连续请求读锁定的几个线程(以重叠的方式想象它们)会发生饥饿事件;想要写锁定的线程永远无法接受它,因为总会有读锁定。