Algorithm 读写器的第二种算法求解
我很难理解读者-作者问题的第二种算法。我理解一般的概念,即作者将优先于读者(读者可能会挨饿)。我甚至理解这个算法的条件变量实现。然而,信号量和互斥实现对我来说毫无意义。这是维基百科的一个例子:Algorithm 读写器的第二种算法求解,algorithm,concurrency,synchronization,Algorithm,Concurrency,Synchronization,我很难理解读者-作者问题的第二种算法。我理解一般的概念,即作者将优先于读者(读者可能会挨饿)。我甚至理解这个算法的条件变量实现。然而,信号量和互斥实现对我来说毫无意义。这是维基百科的一个例子: int readcount, writecount; (initial value = 0) semaphore mutex 1, mutex 2, mutex 3, w, r ; (initial value = 1) READER P(mutex 3); P(r); P(mu
int readcount, writecount; (initial value = 0)
semaphore mutex 1, mutex 2, mutex 3, w, r ; (initial value = 1)
READER
P(mutex 3);
P(r);
P(mutex 1);
readcount := readcount + 1;
if readcount = 1 then P(w);
V(mutex 1);
V(r);
V(mutex 3);
reading is done
P(mutex 1);
readcount := readcount - 1;
if readcount = 0 then V(w);
V(mutex 1);
WRITER
P(mutex 2);
writecount := writecount + 1;
if writecount = 1 then P(r);
V(mutex 2);
P(w);
writing is performed
V(w);
P(mutex 2);
writecount := writecount - 1;
if writecount = 0 then V(r);
V(mutex 2);
[http://en.wikipedia.org/wiki/Readers-writers_problem][2]
我不明白读卡器锁中的三个信号量(互斥3、r和互斥1)是用来做什么的。一个信号量不够读取计数吗?看看,这是维基百科代码的参考。它解释了为什么需要所有的互斥锁。
mutex 1
保护readcount
变量mutext2
保护writecount
变量;mutexr
保护读取操作,mutextw
保护写入操作
1) 让我们假设一位作家进来:
向互斥2发送信号,并递增写入计数,以说明额外的写入器(自身)
由于它是唯一可以更改writecount
(因为它持有mutex 2
)的进程,因此它可以安全地测试它是否是唯一的写入程序(writecount==1
),如果为真,它会发出mutexr
,以防止读卡器进入其他写入程序(writecount>1
)可以享受已发出信号的互斥锁r
然后,写入程序向互斥对象发出信号w
,以保护其更改不受其他(并发)写入程序的影响
最后一个writer(writecount==1
)释放互斥锁r
,让读卡器执行任务
2) 让我们假设一个读者进来:
发出信号mutex 3
,以保护读卡器的设置逻辑不受其他读卡器的影响;然后向互斥锁发出信号r
以防止其他写入程序(请记住,r
在写入程序运行时发出信号);然后向互斥锁1发出信号以保护readcount(来自可能正在退出的其他读卡器),如果它是第一个读卡器(readercount==1
),则向互斥锁发出信号以保护其不受写入程序的影响(现在将写入程序排除在执行其操作之外)
阅读可以并行进行,因此在阅读时不需要其他读者的保护(请记住,此时保持互斥w
,因此不需要作者的干涉)
然后,最后一个读卡器重置写入互斥锁(w
)以允许写入
防止编写器饥饿的诀窍是,编写器伪装成读卡器(当发送互斥信号时),因此即使有很多读卡器,也有很好的机会安排时间。另外,
mutex 3
防止了太多的读者等待mutexr
,因此作者来时有很好的机会发出信号r
。请您发布算法或维基百科页面的链接,以确保我们都在看同一件事吗?谢谢阿提拉的解释。写的部分很有道理,但读的部分我还是不清楚。也许为了更好地理解这一点,您可以解释如果没有互斥3和互斥1信号量(只有r信号量保留以保护读取计数)?读取计数由mutex 1
保护mutex 3
用于将等待r
的并发读卡器数量限制为1(以防止写入程序饥饿)r
用于协调读写器之间的访问