再谈多线程模型之生产者消费者(基础概念)(c++11实现)

0.关于

为缩短篇幅,本系列记录如下:
再谈多线程模型之生产者消费者(基础概念)(c++11实现)本文
再谈多线程模型之生产者消费者(单一生产者和单一消费者)(c++11实现)
再谈多线程模型之生产者消费者(单一生产者和多消费者)(c++11实现)
再谈多线程模型之生产者消费者(多生产者和单一消费者 )(c++11实现)
再谈多线程模型之生产者消费者(多生产者和多消费者 )(c++11实现)
再谈多线程模型之生产者消费者(总结)(c++11实现)

本文涉及到的代码演示环境: VS2017

欢迎留言指正

1.必要知道的概念

  • 1.1 涉及对象: 生产者消费者缓冲区
  • 1.2 模型分类: 一对一一对多多对多 。单一生产者 VS 单一消费者 、单一生产者VS多个消费者、多个生产者者VS单一消费者 、多个生产者VS多个消费者。共4种模型。
  • 1.3 互斥: 生产者之间存在互斥、消费者之间存在互斥、生产者和消费者之间是互斥同步的关系。
  • 1.4 分析方法: 找出模型之间的互斥与同步的关系。根据模型分类,最少存在一个生产者和一个消费者,那么必然存在同步的关系。接下来主要找到谁与谁之间存在互斥。
  • 1.5 为什么要互斥? 简明扼要: 避免脏数据的现象。 例子? ATM取钱。

下面开始介绍各个模型之间的关系。

2.概述

  • 2.1 生产者

    情形 处理
    缓冲区满 生产者则需要停止生产,且停止放入缓冲区
    缓冲区没有满 生产者将数据放入缓冲区
  • 2.2 消费者

    情形 处理
    缓冲区为空 消费者者则需要停止消费,且停止从缓冲区种取出数据
    缓冲区不为空 消费者从缓冲区种取出数据
  • 2.3 大前提: 保持互斥与同步

  • 2.4 一定要明白互斥同步的区别。线程互斥需要使用std::mutex, 而线程同步需要使用std::condition_variable。互斥保护的是临界区,而同步则是控制线程访问顺序。

  • 2.5 怎么确定需要多少个互斥变量和条件变量? 需要掌握上面提到的4个模型分类:1VS1, 1VS多,和 多VS多。分析哪些对象之间存在互斥,哪些对象之间存在同步。这样,就确定了互斥与条件变量的个数。

  • 2.6 一个贴入生活的例子(例子可能不够准确:直接给手里不就完了嘛,但是表达了生产者与消费之间的关系):吃水果。父母(生产者)向果盘(缓冲区)放入水果,儿子女儿(消费者)负责吃水果。 当父母放入水果后,通知儿女可以吃水果了, 当儿女发现果盘为空,通知父母继续放入水果。果盘放满了, 父母就需要等待儿女拿出后再放入,而果盘空了,儿女则需要等待父母放入后才能拿水果。

posted @ 2020-10-20 22:37  mohist  阅读(1041)  评论(0编辑  收藏  举报