【Parallel Programming】生产者消费者模型 |C++11 condition_variable

本文介绍了C++11中的并发编程概念,特别是condition_variable在实现生产者消费者模型中的应用。通过线程安全的队列,平衡生产者和消费者的速率,避免一对一的等待关系。文章详细讲解了条件变量的使用,包括wait()和notify_one/notify_all方法,以及如何与互斥锁配合确保线程同步。此外,还讨论了伪唤醒现象和unique_lock的作用。
摘要由CSDN通过智能技术生成

生产者、消费者模型

线程A和B,共享一个固定大小的缓冲区queue/deque,A产生数据放入缓冲区,B从缓冲区中取出数据进行计算。那么这就是一个生产者消费者模型:A是生产者、B是消费者;

为什么又生产生消费者模型?

通过一个缓冲区,平衡生产者和消费者之间的生产速度和消费速率,主要是避免生产者和消费者,一对一的生产关系,一个等一个那肯定很慢。

  1. 因此,消费者消费完了,就到缓冲区里面取。
  2. 生产者可以一直往缓冲区里面生产,如果缓冲区满了,则不生产。如果有更多的more_data_to_prepare,则往队列里面放。

注意点:

  1. 保证生产者,不会在缓冲区满的时候继续生产,消费这也不会在空的时候继续消费。因此producer/consumer判断缓冲区是否为空 / 满,非常关键。
  2. 当缓冲区满的时候,生产者休眠。不满则继续生产。

优点 & 应用场景

  1. 解耦
  2. 服用
  3. 调整并发数
  4. 异步
  5. 分布式

举例:任务执行框架解耦:任务提交者是producer,任务操作者是consumer

C++11 condition_variable

线程同步的方式:

  1. 互斥锁、条件变量、信号量、

condition_variable 条件变量:

  1. 同步机制,可以用来实现线程同步
  2. 必须与互斥量mutex配合使用。

condition variable适用场景:
线程A对某条件进行判断,如果条件不满足,则进行等待,如果条件满足,该线程会接收到其他线程发来的通知,进行任务执行。

重要概念

condition variable

condition variable 是一个对象,能够用来阻塞线程,直接被notified才会恢复

使用unique_lock 来锁住线程,当某一个线程wait被调用的时候。线程仍旧被阻塞直到被另外一个线程唤醒,即另一个线程调用notification函数在相同的condition variable对象上

notify_one | notify_all

unblock一个当前正在wait的线程, 如果没有线程
unblock所有正在waiting这个contidion的线程,如果没有线程正在waiting, 这个函数什么也不做。

案例

生产者:


                
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值