在同步对共享资源的访问时,不是否有理由使用读/写锁而不是vanilla mutex(基本上只是写锁),除此之外它具有比我可能需要的更多功能的哲学原因?
换句话说,如果我只是默认读/写锁作为我选择的首选同步结构,那么我是否会在脚下拍摄自己?
在我看来,总是选择读/写锁定并相应地使用读取与写入锁定的一个很好的理由是,我可以实现一些同步,然后在获得可能的好处时再也不必考虑它如果有一天我将代码放入更高争用的环境中,将来可以获得更好的性能可扩展性。因此,假设它具有潜在的好处而没有实际成本,那么一直使用它是有意义的。这有意义吗?
这是一个不受资源限制的系统,它可能更像是一个性能问题。另外我一般都会提到这个问题,但如果重要的话,我会特别考虑Qt QReadWriteLock
和QMutex
(C ++)。
答案 0 :(得分:2)
实际上,读/写锁定对中的写锁定比简单的互斥锁更昂贵。读取/写入锁定始终具有一些在获取或释放锁定时必须应用的协调策略。根据具体实施情况,这种策略可能既便宜又昂贵,但始终存在。
在QReadWriteLock
的情况下,有一些逻辑优先考虑作者。尽管这种逻辑的实现可能是有效的,并且在等待队列中没有读者,但它从来都不是完全免费的。
我不熟悉QMutex
和QReadWriteLock
实施的所有细节,但文档说明QMutex
针对非竞争案件进行了大量优化。 QReadWriteLock
没有这样的评论。也许是因为他们只是忘记做出这样的说明,但也许是因为它在这种情况下的行为不如QMutex
那么好。
我认为,在最佳情况下,使用读/写锁定的惩罚可以忽略不计。但在最糟糕的情况下,当你为每一纳秒而战时,它可能会引人注目。
答案 1 :(得分:1)
它真的归结为锁的拥挤特征。当简单的互斥体表现得更好的情况是作家偏好的严重拥塞。
这是一个非常冗长且值得商榷的主题。我可以推荐Spinlocks and Read-Write Locks和Sleeping Read-Write Locks阅读,以便您做出明智的决定吗?