想知道以下读写器执行问题是否正确。
我们只使用一个互斥锁和一个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();
}
}
在代码中看起来:
只使用一个锁,因此没有死锁问题;
作家只能在count == 0
时写作,因此没有竞争条件。
对于读者之前的读/写问题,上述代码有问题吗?看起来所有标准实现都使用两个锁(例如https://en.wikipedia.org/wiki/Readers%E2%80%93writers_problem#First_readers-writers_problem)。如果上面的实现看起来是正确的,为什么我们在wiki中使用两个锁?谢谢!
答案 0 :(得分:1)
这是正确的,但它会表现得非常糟糕。想象一下,如果读者在尝试工作时有两个等待的作者。这两位等待的编写者将不断获取和释放互斥锁,在读者试图完成其工作时使CPU资源饱和,以便整个系统能够取得进展。
噩梦般的场景是读者与其中一位等待作者共享物理核心。让人惊讶。
正确,是的。有用且明智,绝对不是!
使用两个锁定的一个原因是防止两个编写者竞争。更常见的解决方案,至少在我的经验中,是使用带有条件变量的锁来释放等待的写入者或替代阶段。