多线程 浅谈条件变量

条件变量,cond wait过程中:存在:

  1. 调用wait前加锁
  2. while判断并调用wait,
  3. wait内部解锁,
  4. wait收到信号后重新加锁\这几步操作,

即:在cond wait前,需要加锁,wait时,会把自己放到唤醒队列中,并释放锁;当生产者发来cond signal信号后,该cond wait操作会再次加锁,然后执行对临界资源的操作

条件变量有两点需要注意:

  1. 条件变量要和锁结合起来使用
  2. 条件变量要用while循环来判断条件是否成立,而不能用if语句来判断

关于以上两点的解释,可以参考:多线程中 关于条件变量和互斥锁的疑惑(纯干货)

上文解释的很好,尤其对第二点,若用if来判断,则

  1. 条件还未成立时,若系统误发送了信号给wait线程,则wait线程后续会对条件为未ready的临界资源进行操作,存在严重问题,而采用while循环时,当wait线程收到信号后,会再次对while的条件进行判断,二次确认临界区资源(条件)确实ready后,才会进行后续的操作,万无一失;
  2. 生产者消费者模型中,假设生产者产生一个资源,存在两个消费者a、b同时竞争该资源,假设两个消费者都先后拿到锁,发现没有资源,然后都会睡眠,这时候生产者拿到了锁,生产了一个资源,然后notify all,这时候如果消费者a拿到了锁,此时不会有什么问题,正常完成对该资源的消费;之后,消费者b也拿到了锁,由于用的是if,而不是while,不会二次对条件进行判断(此时资源已经被消费者a用掉了,若用while的话循环会继续,继续wait),则会执行后续的消费语句,就会发生问题。 总结下,就是生产者只生产了1个产品,唤醒了多个消费者,多个消费者同时消费了一个产品

对于问题第一点,这篇总结的更好一些:条件变量 之 稀里糊涂的锁(很好的文章)

总结下:

  1. signal先于wait时,该信号会丢失,不会被后续的wait捕获
  2. 条件变量wait时,条件的判断和wait操作需要锁来保证原子性,要保证这一点,需要生产者在生产资源、cond signal时加和cond wait相同的锁,这样就会保证ocnd wait和cond signal先后顺序不会有问题,无论是谁先执行,都不会存在任何问题。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值