之前介绍过 生产者、消费者模式,是一种常用的多线程并发设计模式,本文记录 C++ 实现的过程。
生产者消费者模式 {#生产者消费者模式}
生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。该问题描述了两个共享固定大小缓冲区的线程------即所谓的"生产者"和"消费者"------在实际运行时会发生的问题。
生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。
该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。
根据生产者和消费者数量的多少,程序复杂程度也不同,可以分为 :单生产者-单消费者模型 ,单生产者-多消费者模型 ,多生产者-单消费者模型 ,多生产者-多消费者模型。
单生产者-单消费者模型 {#单生产者-单消费者模型}
单生产者-单消费者模型中只有一个生产者和一个消费者,生产者不停地往产品库中放入产品,消费者则从产品库中取走产品,产品库容积有限制,只能容纳一定数目的产品,如果生产者生产产品的速度过快,则需要等待消费者取走产品之后,产品库不为空才能继续往产品库中放置新的产品,相反,如果消费者取走产品的速度过快,则可能面临产品库中没有产品可使用的情况,此时需要等待生产者放入一个产品后,消费者才能继续工作。
- C++11 实现单生产者单消费者模型的代码如下:
单生产者-多消费者模型 {#单生产者-多消费者模型}
与单生产者和单消费者模型不同的是,单生产者-多消费者模型中可以允许多个消费者同时从产品库中取走产品。所以除了保护产品库在多个读写线程下互斥之外,还需要维护消费者取走产品的计数器。
- 代码如下:
多生产者-单消费者模型 {#多生产者-单消费者模型}
与单生产者和单消费者模型不同的是,多生产者-单消费者模型中可以允许多个生产者同时向产品库中放入产品。所以除了保护产品库在多个读写线程下互斥之外,还需要维护生产者放入产品的计数器。
- 代码如下:
多生产者-多消费者模型 {#多生产者-多消费者模型}
该模型可以说是前面两种模型的综合,程序需要维护两个计数器,分别是生产者已生产产品的数目和消费者已取走产品的数目。另外也需要保护产品库在多个生产者和多个消费者互斥地访问。
- 示例代码:
参考资料 {#参考资料}
文章链接:
https://www.zywvvd.com/notes/coding/cpp/cpp-producer-consumer/cpp-producer-consumer/