muduo库学习之线程同步03——不要用读写锁和信号量

本文讨论了在多线程编程中为何应避免使用读写锁和信号量。作者指出,读写锁可能导致正确性问题和性能下降,尤其是在存在数据修改和移植性需求时。同时,信号量的使用容易出错,且可被条件变量和互斥锁替代。建议优先选择mutex和条件变量以简化同步并减少错误。

东阳的学习笔记

不要使用读写锁

读写锁并不像它看上去那样那么美妙!

  1. 从正确性方面来说,一种典型的易犯错误是在持有 read lock 的时候修改了共享数据。这通常发生在程序的维护阶段。程序员不小心在原来read lock保护的函数中调用了会修改状态的函数
  2. 从性能方面来说,读写锁不见得比普通的 mutex_ 更高效。因为它要更新 reader 的数目。如果临界区很小,锁竞争不激烈,那么 mutex 往往会更快。

在多线程编程中我们总是设法缩短临界区

  1. reader lock 可能允许提升为 writer lock,也可能不允许提升。这会带来移植性方面的问题。
  2. 通常 reader lock 是可重入的,writer lock是不可重入的。但是为了防止 writer 饥饿,writer lock通常会阻塞后来的 reader lock,因此 reader lock 在重入时可能导致死锁。因此,追求低延迟读取的场合也不适合使用读写锁

作者语:muduo线程库有意不提供读写锁的封装,因为我还没有在工作中遇到过需要使用 rwlock 替代普通的 mutex_ 会显著提高性能的例子。相反,我们建议首选 mutex。

不要使用信号量

作者语:我还没有遇到过需要使用信号量的情况,无从谈及个人经验。我认为信号量不是必备的同步原语,因此条件变量配合互斥器可以完全替代其功能,而且更不易用错。除了[RWC]指出 的“semaphore has no notion of ownership”之外,信号量的另一个问题在 于它有自己的计数值,而通常我们自己的数据结构也有长度值,这就造 成了同样的信息存了两份,需要时刻保持一致,这增加了程序员的负担 和出错的可能。如果要控制并发度,可以考虑用muduo::ThreadPool。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东阳z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值