Linux| |生产者与消费者模型

生产者与消费者模型

# 前言

对于生产者消费者模型必须要知道的:三二一原则

三二一原则:

  • 三种关系

    • 生产者与生产者之间,生产者与消费者,消费者与消费者

    • 生产者与生产者之间的关系:互斥

      • 也就是对于生产者之间不能同时生产一个东西

    • 消费者与消费者之间的关系:互斥

      • 也就是对于消费者之间不能同时消费一个物品

    • 生产者与消费者之间的关系:同步且互斥

      • 对于生产者与消费者之间不能同时生产消费同一个物品,并且要遵循先生产该商品之后才可以进行消费

  • 两个对象

    • 生产者

    • 消费者

  • 一个交易场所

    • 仓库

我们所实现的是只有一个生产者和一个消费者之间的模型

1. 基于阻塞队列

1.1 概念

  • 使用阻塞队列来进行实现的话,也就是使用该队列对于数据进行存储,对于队列中的数据要使其遵循同步与互斥,必须是先向队列中入数据,然后才能出数据

 

1.2 实现

  • cp.hpp头文件

  • 该文件中封装了,对于数据的插入和删除。并且对于生产者和消费者必须遵循同步和互斥。也就是必须要先生产数据才可以消费数据,生产数据和消费数据不能访问同一片地址空间

    • 消费数据没有数据

      • 如果消费者消费数据的时候没有数据可以被消费,那么就要通知生产者生产数据(实现同步)

    • 生产数据达到队列的上限

      • 如果生产者生产数据已经将队列生产满了,那么就要通知消费者来消费数据(实现同步)

    • 生产数据和消费数据要注意的问题

      • 当生产数据和消费数据的时候必须要对队列进行加锁,这样才能实现互斥(对于临界资源进行保护)。

  • cp.cc文件

    • 具有两个线程

      • 消费者:消费数据

      • 生产者:生产数据

 

1.3 书写时注意问题

  • 具有同一个交易场所

    • 一定是要在主函数中创建一个交易场所,然后将该交易场所,通过指针的方式传递到生产者和消费者中,这样的话才能使消费者和生产者访问同一个交易场所,也就是对于生产者和消费者具有临界资源

  • 实现同步

    • 当实现同步的时候,如果数据已经满了,必须要进行先通知消费者消费数据,然后再将生产者进入等待状态。否则的话有可能导致无法通知到消费者进行消费,从而导致错误

  • 可以设置一个水位线

    • 当数据大于水位线的时候,就要通知消费者消费数据,不会让生产者将交易场所进行生产满

  • 实现互斥

    • 生产者和消费者应该是互斥的,也就是当生产者进行生产数据的时候,消费者不会消费数据

  • 最开始有可能出现生产者生产一个数据,消费者直接就消费了

    • 这是因为最开始的时候,生产者和消费者还没有实现同步的关系,就会导致有可能导致生产者生产一个数据之后,然后时间片到了,CPU进行调度,随之消费者就将数据进行消费了

Linux| |生产者与消费者模型

大家可以参考这个来看一下大体框架,从而来写基于BLockQueue的生成者消费者模型

代码可以在下面看:

https://github.com/YKitty/LinuxDir/tree/master/LinuxCode/pthread/cpAndThreadPool/BlockQueue_cp