c - Reader - Writer 互斥体

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

最佳答案

  • A 行的目的是检查当前读取器是否是写入后的第一个读取器(或总体上的第一个读取器)。如果是这种情况,那么他必须获得数据库互斥量(db),这样就没有写入者可以写入数据库,而至少有一个读取者正在读取它。

    最后一位读者对应的行是:

    if (rc == 0) V(db);

    这一行的目的,是检查当前的读者是否是最后一个读者,以便作者可以进入下一个(如果没有另一个读者在作者之前进入)。

  • 根据上面的描述,如果您删除 A 行,您的代码将无法正常工作。

注意:正如下面 Vlad 的回答(及其评论中的讨论)所示,V(mutex) 应该在 if (rc == 0) V(db).

关于c - Reader - Writer 互斥体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2307553/

相关文章:

c++ - 互斥锁和线程独立性

c++ - 当线程数增加时,多线程文件 IO 程序的行为不可预测

locking - 来自 "The Art of Multiprocessor Programming"的 LockTwo

c++ - C 或 C++ 中简单的键值平面文件数据库

c++ - 十六进制到十进制与 char 给出奇怪的结果?

c - 没有引用 pthread_mutex_lock 编译 -lpthread

Java 进程间互斥锁

c - 如何查找表达式的哪个索引与正则表达式匹配

c - 如何找到数组的大小(从指向数组第一个元素的指针)?

c - 使用函数打印两个变量