我有一个家庭作业问题,我必须实现一个读写器锁。请注意我不看/要求代码。我希望了解读写器锁的行为,这将有助于我最终确定实现细节。
让我们说获取锁的请求遵循以下顺序:R W R W R W R W .. 为了防止饥饿,我们应该以相同的顺序处理请求吗?如果我选择跳过写请求(从而给读者更高的偏好),我怎样才能确保编写器线程不会饿死?
如果给作者一个更高的偏好,我认为读者线程有可能会饿死。
我认为我目前的计划适用于RRRRWRRRRWWWRRRRR,WWWWWWRRRRWRRRR,RRRRRRR,WWWWWWW,RWRRR,WRWWWW等序列。
我还没有考虑其他任何情况吗? - 我知道这是一个很难回答的问题。因为我没有透露任何细节,也没有列举我考虑的所有情景。请多多包涵!
答案 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)
“更高优先级”只能在等待时间没有限制时产生饥饿。
如果任何线程可以等待的时间限制为某个有限值,则该线程不会饿死。
所以,只要你跟踪线程何时进入队列并且不让它们等待“太长时间”,你就可以在一般情况下(或反过来)“优先考虑读者而不是写作者”,同时仍然没有造成活锁。
通过在拍摄作品之前只为最大数量的读者提供服务,可以获得同样的效果,反之亦然。