读者 - 作家互斥

时间:2010-02-21 21:38:32

标签: c mutex

这是读写一致性的读写器问题。 这是算法:

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.如果我们删除该行,代码仍能正常工作吗?

3 个答案:

答案 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),他必须清理封锁。