这个读写器锁实现是否正确?

时间:2016-09-26 03:01:16

标签: multithreading operating-system thread-safety

想知道以下读写器执行问题是否正确。

我们只使用一个互斥锁和一个count变量来表示读者人数。

阅读api:

void read() {
    mutex.lock();
    count ++;
    mutex.unlock();
    // Do read
    mutex.lock();
    count --;
    mutex.unlock();
}

写api:

void write() {
    while(1) {
        mutex.lock();
        if(count == 0) {
            // Do write
            mutex.unlock();
            return;
        }
        mutex.unlock();
    }
}

在代码中看起来:

  1. 只使用一个锁,因此没有死锁问题;

  2. 作家只能在count == 0时写作,因此没有竞争条件。

  3. 对于读者之前的读/写问题,上述代码有问题吗?看起来所有标准实现都使用两个锁(例如https://en.wikipedia.org/wiki/Readers%E2%80%93writers_problem#First_readers-writers_problem)。如果上面的实现看起来是正确的,为什么我们在wiki中使用两个锁?谢谢!

1 个答案:

答案 0 :(得分:1)

这是正确的,但它会表现得非常糟糕。想象一下,如果读者在尝试工作时有两个等待的作者。这两位等待的编写者将不断获取和释放互斥锁,在读者试图完成其工作时使CPU资源饱和,以便整个系统能够取得进展。

噩梦般的场景是读者与其中一位等待作者共享物理核心。让人惊讶。

正确,是的。有用且明智,绝对不是!

使用两个锁定的一个原因是防止两个编写者竞争。更常见的解决方案,至少在我的经验中,是使用带有条件变量的锁来释放等待的写入者或替代阶段。