读者编写器锁实现

时间:2012-02-21 17:40:22

标签: synchronization locking

我有一个家庭作业问题,我必须实现一个读写器锁。请注意我不看/要求代码。我希望了解读写器锁的行为,这将有助于我最终确定实现细节。

让我们说获取锁的请求遵循以下顺序:R W R W R W R W .. 为了防止饥饿,我们应该以相同的顺序处理请求吗?如果我选择跳过写请求(从而给读者更高的偏好),我怎样才能确保编写器线程不会饿死?

如果给作者一个更高的偏好,我认为读者线程有可能会饿死。

我认为我目前的计划适用于RRRRWRRRRWWWRRRRR,WWWWWWRRRRWRRRR,RRRRRRR,WWWWWWW,RWRRR,WRWWWW等序列。

我还没有考虑其他任何情况吗? - 我知道这是一个很难回答的问题。因为我没有透露任何细节,也没有列举我考虑的所有情景。请多多包涵!

2 个答案:

答案 0 :(得分:1)

读写器系统中饥饿的常见原因是存在“共享”锁,允许多个读取器锁定同一资源。

writer    reader1    reader2

          LOCK_SH
          obtained
LOCK_EX     |       
waiting     |
   :        |        LOCK_SH
   :        |        obtained
   :        |          |
   :      -------      |
   :                   |
hungry    LOCK_SH      |
   :      obtained     |
   :        |        -------
   :        |
   :        |        LOCK_SH
starving    |        obtained
   :      -------      |
   :                   |
                      ...

如果简单地优先考虑一个或另一个,你可以简单地有两个队列,一个用于读者,一个用于作者,并为每个Y作者提供X读者(如果有的话)(如果有的话等待) )。

答案 1 :(得分:1)

“更高优先级”只能在等待时间没有限制时产生饥饿。

如果任何线程可以等待的时间限制为某个有限值,则该线程不会饿死。

所以,只要你跟踪线程何时进入队列并且不让它们等待“太长时间”,你就可以在一般情况下(或反过来)“优先考虑读者而不是写作者”,同时仍然没有造成活锁。

通过在拍摄作品之前只为最大数量的读者提供服务,可以获得同样的效果,反之亦然。