【Linux】生产者消费者模型

【Linux】生产者消费者模型_第1张图片

樊梓慕:个人主页

 个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C++》《Linux》《算法》

每一个不曾起舞的日子,都是对生命的辜负


目录

前言

1.生产者消费者模型

1.1概念

 1.2特点

2.基于阻塞队列的生产者消费者模型

2.1什么是阻塞队列?

2.2queue模拟阻塞队列的生产消费模型

​编辑

3.POSIX信号量

3.1信号量是如何实现互斥和同步的?

3.2信号量的概念

3.3信号量函数

3.3.1初始化信号量sem_init

3.3.2销毁信号量sem_destroy

3.3.3等待信号量sem_wait(P操作)

3.3.4释放信号量sem_post(V操作) 

 4.基于环形队列的生产者消费者模型

4.1基本原理

4.2两个规则

4.2.1生产者和消费者不能对同一个位置进行访问

 4.2.2无论是生产者还是消费者,都不应该将对方套圈

4.3vector模拟环形队列的生产消费模型


前言

本篇文章内容:生产者消费者模型概述、基于阻塞队列BlockQueue的生产者消费者模型、POSIX信号量、基于环形队列的生产者消费者模型。


欢迎大家收藏以便未来做题时可以快速找到思路,巧妙的方法可以事半功倍。 

=========================================================================

GITEE相关代码:樊飞 (fanfei_c) - Gitee.com

=========================================================================


1.生产者消费者模型

1.1概念

生产者消费者模型就是通过一个容器来解决生产者和消费者的强耦合问题。

生产者和消费者彼此之间不直接通讯,而通过某种容器来进行通讯。

所以生产者生产完数据之后不用等待消费者处理,直接扔给容器,消费者不找生产者要数据,而是直接从容器里取,容器就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个容器就是用来给生产者和消费者解耦的。那么下面我们会介绍两种实现生产者消费者模型的方式:一种是基于阻塞队列的,一种是基于环形队列的。

【Linux】生产者消费者模型_第2张图片


 1.2特点

生产者消费者模型是多线程同步与互斥的一个经典场景,其特点如下:

  • 3种关系: 生产者和生产者(互斥关系)、消费者和消费者(互斥关系)、生产者和消费者(互斥关系、同步关系)。
  • 2种角色: 生产者和消费者。(通常由进程或线程承担)
  • 1个交易场所: 通常指的是内存中的一段缓冲区。(可以自己通过某种方式组织起来)

说明:

所有的生产者和消费者都会竞争式的申请锁,因此生产者和生产者、消费者和消费者、生产者和消费者之间都存在互斥关系。

同步的解释:

同步说白了就是让多线程能够协同起来工作,而不是不管不顾,比如生产者消费者模型场景下:

  • 如果让生产者一直生产,那么当生产者生产的数据将容器塞满后,生产者再生产数据就会生产失败。
  • 反之,让消费者一直消费,那么当容器当中的数据被消费完后,消费者再进行消费就会消费失败。
  • 虽然这样不会造成任何数据不一致的问题,但是这样会引起另一方的饥饿问题,是非常低效的。我们应该让生产者和消费者访问该容

你可能感兴趣的:(Linux,linux,运维,服务器)