关于多线程:此读写器锁实现正确吗?

Is this reader-writer lock implementation correct?

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

我们仅使用一个互斥锁和一个count变量来表示读取器的数量。

阅读api:

1
2
3
4
5
6
7
8
9
void read() {
    mutex.lock();
    count ++;
    mutex.unlock();
    // Do read
    mutex.lock();
    count --;
    mutex.unlock();
}

写api:

1
2
3
4
5
6
7
8
9
10
11
void write() {
    while(1) {
        mutex.lock();
        if(count == 0) {
            // Do write
            mutex.unlock();
            return;
        }
        mutex.unlock();
    }
}

类似于代码:

  • 仅使用一个锁,因此没有死锁问题;

  • 写入器只能在count == 0时写入,因此没有竞争条件。

  • 至于读者之前的读/写问题,以上代码是否有问题?看起来所有标准实现都使用两个锁(例如https://en.wikipedia.org/wiki/Readers–writers_problem#First_readers-writers_problem)。如果上述实现似乎正确,为什么我们在Wiki中使用两个锁?谢谢!


    这是正确的,但效果会很糟糕。想象一下,当一个读者试图做某件事时,有两个正在等待的作家。这两个等待的编写者将不断获取并释放该互斥体,从而在读者试图完成其工作时饱和CPU资源,以便整个系统可以向前发展。

    梦night的场景是读者与等待中的一位作家共享一个物理核心。 Yikes。

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

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