·最简单的情形--(一个生产者 + 一个消费者 + 一个大小为1的有限缓冲)

首先来分析其中的同步关系:

·必须在生产者放入一个产品之后,消费者才能够从缓冲中取出产品来消费。
·只有在消费者从缓冲区中取出产品(消费)之后,生产者才能再放新的产品进缓冲区。

下面我们用P(Producer)来表示生产者进程,用C(Consumer)来表示消费者进程,则下面是他们所要进行的操作的伪码表示:

P:
while(true){
//生产一个产品;
//送产品到缓冲区;
};
C:
while(true){
//从缓冲区取产品
//消费产品
};

能不能往缓冲区放东西,取决于缓冲区的状态:
·空--只能放,不能取
·满--只能取,不能放
因为缓冲区大小为1,所以我们设立两个信号量empty = 1,full = 0

下面是改进后的代码:

P:
while(true){
//生产一个产品;
P(empty);
//送产品到缓冲区;
V(full);
};
C:
while(true){
P(full);
//从缓冲区取产品
V(empty);
//消费产品
};

·生产者--消费者问题的推广(n个缓冲区 + m个生产者 + k个消费者)

也就是下图所示的场景:

下面是改进后的代码:

P:
while(true)
{
//生产产品;
P(empty);
P(mutex1);
//往Buffer [i]放产品;
i = (i+1) % n;
V(mutex1);
V(full);
}; //i的初值为0
C:
while(true)
{
P(full);
P(mutex2);
//从Buffer[j]取产品;
j = (j+1) % n;
V(mutex2);
V(empty);
//消费产品;
}; //j的初值为0

注:

·生产者和消费者之间不需要互斥,所以mutex不能一样

·生产者生产产品与i的加1操作是原子的;消费者消费产品与j的加1操作也是原子的。

[OS] 生产者-消费者问题(有限缓冲问题)的更多相关文章

  1. OS: 生产者消费者问题(二) ---- 系统V IPC通信-信号量和共享内存

    在上一篇“OS: 生产者消费者问题(多进程+共享内存+信号量)”中提到的方法二: 如果进程之间并没有父子关系,但是协商好了共享存储的 KEY , 那么在每个进程中,就可以通过 KEY 以及 shmge ...

  2. (转)OS: 生产者消费者问题(多进程+共享内存+信号量)

    转:http://blog.csdn.net/yaozhiyi/article/details/7561759 一. 引子 时隔一年再次用到 cout 的时候,哥潸然泪下,这是一种久别重逢的感动,虽然 ...

  3. Linux 进程间通信(包含一个经典的生产者消费者实例代码)

    前言:编写多进程程序时,有时不可避免的需要在多个进程之间传递数据,我们知道,进程的用户的地址空间是独立,父进程中对数据的修改并不会反映到子进程中,但内核是共享的,大多数进程间通信方式都是在内核中建立一 ...

  4. C++11 实现生产者消费者双缓冲

    基础的生产者消费者模型,生产者向公共缓存区写入数据,消费者从公共缓存区读取数据进行处理,两个线程访问公共资源,加锁实现数据的一致性. 通过加锁来实现 class Produce_1 { public: ...

  5. Operating System Concepts 项目:生产者-消费者问题 线程

    一. 实验目的 实现一个c程序,该程序能模拟解决有限缓冲问题,其中消费者和生产者产生和消耗随机数 二.实验内容 缓冲区 元数据类型为buffer_item,大小为1000的数组,按环形队列处理 生产者 ...

  6. 进程,线程,GIL,Python多线程,生产者消费者模型都是什么鬼

    1. 操作系统基本知识,进程,线程 CPU是计算机的核心,承担了所有的计算任务: 操作系统是计算机的管理者,它负责任务的调度.资源的分配和管理,统领整个计算机硬件:那么操作系统是如何进行任务调度的呢? ...

  7. 并发编程(一): POSIX 使用互斥量和条件变量实现生产者/消费者问题

    boost的mutex,condition_variable非常好用.但是在Linux上,boost实际上做的是对pthread_mutex_t和pthread_cond_t的一系列的封装.因此通过对 ...

  8. Python之路(第三十八篇) 并发编程:进程同步锁/互斥锁、信号量、事件、队列、生产者消费者模型

    一.进程锁(同步锁/互斥锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理. 例 ...

  9. 进程同步控制(锁,信号量,事件), 进程通讯(队列和管道,生产者消费者模型) 数据共享(进程池和mutiprocess.Pool模块)

    参考博客 https://www.cnblogs.com/xiao987334176/p/9025072.html#autoid-1-1-0 进程同步(multiprocess.Lock.Semaph ...

随机推荐

  1. verilog中参数传递与参数定义中#的作用(二)

    一.module内部有效的定义 用parameter来定义一个标志符代表一个常量,称作符号常量,他可以提高程序的可读性和可维护性.parameter是参数型数据的关键字,在每一个赋值语句的右边都必须是 ...

  2. Ruby 基础教程 1-1

    1.指定编码方式       第一种 在代码文件首行通过 #encoding:GBK的方式     第二种  ruby -E UTF-8 文件名称     第三种  irb  -E UTF-8   2 ...

  3. ThinkPHP开启设置子域名笔记

    一.ThinkPHP框架里 common下的config文件 'APP_SUB_DOMAIN_DEPLOY' => 1, // 开启子域名配置 'APP_SUB_DOMAIN_RULES' =& ...

  4. CentOS 7.2安装11g数据库软件

      Preface       Yesterday I've installed the 11g GI software on CentOS 7.2.But I still encounter som ...

  5. 征战 OSG-序及目录

    其实很早就应该写这个了,一直拖到现在就是因为懒啊. 自从七月演习回来,被划到三维平台开发部,就一直混日子,也没人带领,也没人问结果,就这么一直堕落下来了,直到有一天才发现自己也看不上自己了,觉得自己这 ...

  6. python3 爬虫爬取深圳公租房轮候库(深圳房网)

    深圳公租房轮候库已经朝着几十万人的规模前进了,这是截至16年10月之前的数据了,贴上来大家体会下 所以17年已更新妥妥的10W+ 今天就拿这个作为爬虫的练手项目 1.环境准备: 操作系统:win10 ...

  7. 洪水!(Flooded! ACM/ICPC World Final 1999,UVa815)

    题目描述:竞赛入门经典的习题4-10 解题思路:1.把各个网格想象成一个数组 2.排序 3.雨水总体积去铺满 //太懒了只写了求海拔 #include <stdio.h> #define ...

  8. 【转】网游服务器中的GUID(唯一标识码)实现-基于snowflake算法

    本文中的算法采用twitter的snowflake算法,具体请搜索介绍,原来是用Scala写的,因我项目需要,改写成C++语言,主要用于高效的生成唯一的ID, 核心算法就是毫秒级时间(41位)+机器I ...

  9. Deep Residual Learning for Image Recognition论文笔记

    Abstract We present a residual learning framework to ease the training of networks that are substant ...

  10. 改maven下创建的动态网站依赖的jre版本

    问题描述 通过maven创建一个动态网站后,eclipse会提示一个提醒 Build path specifies execution environment J2SE-1.5. There are ...