这里写目录标题
生产者、消费者模型
线程A和B,共享一个固定大小的缓冲区queue/deque,A产生数据放入缓冲区,B从缓冲区中取出数据进行计算。那么这就是一个生产者消费者模型:A是生产者、B是消费者;
为什么又生产生消费者模型?
通过一个缓冲区,平衡生产者和消费者之间的生产速度和消费速率,主要是避免生产者和消费者,一对一的生产关系,一个等一个那肯定很慢。
- 因此,消费者消费完了,就到缓冲区里面取。
- 生产者可以一直往缓冲区里面生产,如果缓冲区满了,则不生产。如果有更多的more_data_to_prepare,则往队列里面放。
注意点:
- 保证生产者,不会在缓冲区满的时候继续生产,消费这也不会在空的时候继续消费。因此producer/consumer判断缓冲区是否为空 / 满,非常关键。
- 当缓冲区满的时候,生产者休眠。不满则继续生产。
优点 & 应用场景
- 解耦
- 服用
- 调整并发数
- 异步
- 分布式
举例:任务执行框架解耦:任务提交者是producer,任务操作者是consumer
C++11 condition_variable
线程同步的方式:
- 互斥锁、条件变量、信号量、
condition_variable 条件变量:
- 同步机制,可以用来实现线程同步
- 必须与互斥量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, 这个函数什么也不做。
案例
生产者: