我是否总是需要使用读写锁而不是普通互斥锁?

8
当同步访问共享资源时,除了哲学上更多功能可能不需要的原因之外,是否有理由不使用读写锁而使用普通互斥锁(基本上只是写锁)?换句话说,如果我默认将读写锁作为首选同步构造,则会不会自己给自己惹麻烦?
在我看来,始终选择读写锁并相应地使用读锁与写锁的一个好理由是,我可以实现一些同步,然后永远不必再考虑它,同时在未来获得更好的性能可扩展性的可能好处,如果有一天将代码放入更高争用的环境中。因此,假设它具有潜在的好处而没有实际成本,那么一直使用它是有道理的。这有道理吗?
这是在一个不真正有限制的系统上,这可能更多是一个性能问题。另外,我通常使用Qt的QReadWriteLock和QMutex(C ++),如果有关系的话。
2个回答

3
实际上,读写锁中的写锁比简单的互斥锁更昂贵。读写锁总是有一些必须应用的协调策略,当你获取或释放锁时。根据特定的实现,这个策略可能便宜或昂贵,但它总是存在的。
QReadWriteLock的情况下,有一些逻辑优先考虑写入者。即使这种逻辑的实现可能是有效的,并且没有读者在等待队列中,它也从来不是完全免费的。
我不熟悉QMutexQReadWriteLock的所有细节,但文档说QMutex在非竞争情况下经过了大量优化。QReadWriteLock没有这样的备注。也许是因为他们忘记了做这样的记录,但也可能是因为在这种情况下,它的行为不如QMutex那么好。
我认为,在最好的情况下,使用读写锁的惩罚是可以忽略不计的。但在最坏的情况下,当你争取每一纳秒时,它可能是明显的。

1

这主要取决于您的锁拥塞特性。当写入者优先并且存在大量拥塞时,简单互斥锁的表现会更好。

这是一个非常冗长且有争议的话题。我建议您阅读自旋锁和读写锁以及睡眠式读写锁,以便做出明智的决定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接