Synchronization 读写器锁的实现

Synchronization 读写器锁的实现,synchronization,locking,Synchronization,Locking,我有一个家庭作业问题,我必须实现读写器锁定。请注意,我不是在寻找/询问代码。我希望了解读写器锁的行为,这将帮助我最终确定实现细节 假设获取锁的请求遵循以下顺序:R W R W。。 为了防止饥饿,我们是否应该以相同的顺序处理请求?如果我选择跳过一个写请求(从而给读者一个更高的偏好),我如何确保写入线程不会饿死 如果给作者一个更高的偏好,我认为有可能读者线程将饿死 我认为我目前的计划将适用于RRRRRRRWRRRRR、WWWW RRRRWRRRR、RRRRRRR、WWWWWWW、RWRRR、WRWW

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

假设获取锁的请求遵循以下顺序:R W R W。。 为了防止饥饿,我们是否应该以相同的顺序处理请求?如果我选择跳过一个写请求(从而给读者一个更高的偏好),我如何确保写入线程不会饿死

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

我认为我目前的计划将适用于RRRRRRRWRRRRR、WWWW RRRRWRRRR、RRRRRRR、WWWWWWW、RWRRR、WRWWWW等序列


还有其他我没有考虑的情况吗我知道这是一个很难回答的问题,特别是因为我没有透露任何细节,也没有列举我考虑过的所有情况。请容忍我

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

writer    reader1    reader2

          LOCK_SH
          obtained
LOCK_EX     |       
waiting     |
   :        |        LOCK_SH
   :        |        obtained
   :        |          |
   :      -------      |
   :                   |
hungry    LOCK_SH      |
   :      obtained     |
   :        |        -------
   :        |
   :        |        LOCK_SH
starving    |        obtained
   :      -------      |
   :                   |
                      ...
如果只需优先选择其中一个,您只需拥有两个队列,一个用于读者,一个用于作者,并为每Y个作者(如果有等待)提供X个读者(如果有)。只有在等待时间没有限制的情况下,“更高优先级”才能产生饥饿

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

因此,只要您跟踪线程何时进入队列,并且不让它们等待“太长时间”,您就可以在一般情况下(或相反)将读线程优先于写线程,同时仍然不会导致活锁


同样的效果也可以通过在使用编写器之前只为最大数量的读卡器提供服务来实现,反之亦然。

在理想情况下,您需要为所有传入的读卡器提供服务,这些读卡器将比最长的正在读卡器短。你不能预测,但是你可以做一些动态的方法来适应程序的行为。我认为这两个答案都很好。我随机挑了一个正确的。太遗憾了,我不能同时接受这两个条件。:)