这是读写一致性的读写器问题。 这是算法:
void reader() {
while (1) {
P(mutex);
rc++;
if (rc == 1) P(db); /* <---- A */
V(mutex); /* <---- B */
read_data_base();
P(mutex);
rc--;
V(mutex);
if (rc == 0) V(db);
}
}
void writer() {
while (1) {
P(db);
write_data_base();
V(db);
}
}
以下是我的问题: 1.读者代码中A行的目的是什么? 2.如果我们删除该行,代码仍能正常工作吗?
答案 0 :(得分:3)
A行的目的是检查当前阅读器是否是写入后的第一个阅读器(或整个第一个阅读器)。如果是这种情况,那么他必须获取数据库互斥(db),以便没有编写者可以写入数据库,而至少有一个读者可以读取它。
最后一位读者的相应行是:
if (rc == 0) V(db);
这一行的目的是检查当前读者是否是最后一个读者,以便作者可以进入下一个(如果在作者之前没有其他读者进入)。
根据以上说明,如果删除A行,您的代码将无法正常运行。
注意:如下面的Vlad的回答(及其评论中的讨论)所示,V(mutex)
应该在if (rc == 0) V(db)
之后。
答案 1 :(得分:1)
首先,代码错误:您需要在锁定的if (rc ==0) V(db)
下执行mutex
。
需要A行才能锁定数据库以供阅读。锁定在第一次读取操作时设置,在最后一次读取后释放;并且它在每个可能的写入操作期间设置。如果不设置锁定,则可以同时执行读写操作,这会导致数据损坏。
答案 2 :(得分:0)
作者不应该在任何人阅读时写作。因此,如果他是早鸟(#1),任何读者在阅读时都会阻止db。如果他是房间里的最后一个人(rc == 0),他必须清理封锁。