生产者消费者问题
设信号量mutex1, mutex2, full1, full2, empty1, empty2分别表示1和2号缓冲区的访问互斥, 是否满, 是否空
semaphore mutex1 = 1, empty1 = n, full1 = 0;
semaphore mutex2 = 1, empty2 = m, full2 = 0;
void A()//向缓冲池1添加商品
{
while(1)
{
produce next product1;
p(empty1);//检测当前缓冲池是否为空,如果为空(说明我A需要向里面放东西了),则进行下一步,否则,阻塞本进程
p(mutex1);//检测是否可以进入缓冲区(即检测缓冲区中是否有其他进程),若可以则自己进去并锁上门,否则,阻塞本进程
buffer1(i) = product1;//将商品放入缓冲区1
i = (i + 1) % n;//缓冲队列的尾指针后移
v(mutex1);//放完商品,离开缓冲区,释放互斥访问锁,允许其他进程进入
v(full1);//通知进程B,我已放好商品,你可以来取了
}
} void B()//从缓冲区1中取出商品,放到缓冲区2
{
while(1)
{
p(full1);// 先检测缓冲区1内是否有货
p(mutex1);// 有货,再检测缓冲区1是否有其他进程正在访问,没有的话,自己进去并锁上门
goods = buffer1(j);//取货
j = (j + 1) % n; //缓冲队列队首指针后移
v(mutex1);// 取完货后,释放缓冲区1的互斥访问锁
v(empty1);// 提示A我取出货了,你可以接着往里面放了
Consume goods and Produce next product2;
p(empty2);// 检测缓冲区2是否为空
p(mutex2);// 检测当前缓冲区中是否有其他进程
buffer2(a) = product2;// 向2号缓冲区放置商品
a = (a + 1) % m;// 2号缓冲区缓冲队列队尾指针后移
v(mutex2);// 离开缓冲区2,释放锁
v(full2);// 通知C进程可以来取货了(我已经放进去商品了,你可以来取了)
}
} void C()
{
while(1)
{
p(full2);// 检测2号缓冲区内是否有货
p(mutex2);//若有货,加锁,进入
goods = buffer2(b);//取出商品
b = (b + 1) % m;//2号缓冲区队首指针后移
v(mutex2);// 离开缓冲区2,释放锁
v(empty2);// 通知B进程,我已经取出商品,你可以继续往里面放了
Consume product;
}
} int main()
{
parbegin(A(), B(), C());//A,B,C三个进程并发执行
}

  

设有三个进程A、B、C,其中A与B构成一对生产者与消费者(A为生产者,B为消费者),共享一个由n个缓冲块组成的缓冲池;B与C也构成一对生产者与消费者(此时B为生产者,C为消费者)共享另一个由m个缓冲块组成的缓冲池。用P、V操作描述它们之间的同步关系。的更多相关文章

  1. (转)USB的描述符及各种描述符之间的依赖关系

    全文链接:http://justmei.blog.163.com/blog/static/11609985320102421659260/?latestBlog 1 推荐 [原创] USB入门系列之七 ...

  2. 三、进程和线程、协程在python中的使用

    三.进程和线程.协程在python中的使用 1.多进程一般使用multiprocessing库,来利用多核CPU,主要是用在CPU密集型的程序上,当然生产者消费者这种也可以使用.多进程的优势就是一个子 ...

  3. 《Linux内核设计与实现》读书笔记 第三章 进程管理

    第三章进程管理 进程是Unix操作系统抽象概念中最基本的一种.我们拥有操作系统就是为了运行用户程序,因此,进程管理就是所有操作系统的心脏所在. 3.1进程 概念: 进程:处于执行期的程序.但不仅局限于 ...

  4. linux内存源码分析 - 内存压缩(同步关系)

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 概述 最近在看内存回收,内存回收在进行同步的一些情况非常复杂,然后就想,不会内存压缩的页面迁移过程中的同步关系也 ...

  5. Linux内核分析——第三章 进程管理

    第三章 进程管理 3.1 进程 1.进程就是处于执行期的程序:进程就是正在执行的程序代码的实时结果:进程是处于执行期的程序以及相关的资源的总称:进程包括代码段和其他资源. 线程:是在进程中活动的对象. ...

  6. Prism 文档 第三章 管理组件之间的依赖关系

                                                                          第3章:管理组件之间的依赖关系 基于Prism库的复合应用程 ...

  7. c-lodop的三个进程和一个服务介绍

    在windows任务管理器里,最新版可以看到有三个进程,例如安32位c-lodop的时候,有CLodopPrint32.exe.CLodopPrint32_backup.exe.CLodopServi ...

  8. java多线程上篇(三) -- 进程通信和线程死锁简单介绍

    进程通信指的是进程间的信息交换 ,IPC(Inter-Process Communication,进程间通信) 进程通信就相当于一种工作方式.沟通形式,进程通信主要指的就是操作系统提供的进程通信工具( ...

  9. 搭建NTP时间服务器~使用NTP同步时间~构建主机间时间自动同步关系

    NTP是一个时间服务器,同时它也是一个时间客户端. 我们可以使用它构建主机与主机之间的时间自动同步环境,保证所有服务器时间一致性. 常用的公共NTP时间服务器有: cn.ntp.org.cn 中国 n ...

随机推荐

  1. windows下安装TensorFlow(CPU版)

    建议先到anaconda官网下载最新windows版的anaconda3.6,然后按步骤进行安装.(这里我就不贴图了,自己下吧) 1.准备安装包 http://www.lfd.uci.edu/~goh ...

  2. php数组·的方法-数组检索

    /* * //数组检索函数 * */ //array_keys() 获取数组中所有键名 //array_values() 获取数组中所有键名 $arr6=range('a','e'); print_r ...

  3. es6.3学习笔记

    es版本发布相当快,从1.x到2.x,再直接到5.x,6.x 索引这个词在es中有多重意思: 索引(名词):一个索引类似于传统数据库中的一个索引,用于存储关系型文档.索引的复数为indexes或ind ...

  4. hadoop 常用hdfs命令

  5. Unity 在Inspector面板,脚本前面的激活对勾

    写个脚本,把它挂在一个游戏对象上: using System.Collections; using System.Collections.Generic; using UnityEngine; pub ...

  6. CentOS 7 修改root 密码

    环境: 1.重启系统在加载内核的地方按e,编辑启动脚本 2.将ro crashkernel = auto 所在地的 ro 替换为 rw init=/sysroot/bin/sh 3.修改完成后用Ctr ...

  7. 深入理解C语言函数指针(转)

    本文转自:http://www.cnblogs.com/windlaughing/archive/2013/04/10/3012012.html 示例1: void myFun(int x); //声 ...

  8. 使用DOS批处理更改IP地址

    有时候电脑在家需要自动获取IP,在公司需要手动填写IP,改来改去很麻烦,于是做一个批处理一键修改很方便: @echo off cls color 0A @echo off echo. echo === ...

  9. 2019.3.26判断是否回文(java实现)

    我所有的文章都是对我总结学习的总结,那里不好或者冒犯了那里,我先对您说声对不起,请告知我进行改正. 今天java老师作业题目是判断是一个字符串否是回文: emmmm,我的思路是将字符串逆序,然后使用方 ...

  10. <Android 基础(九)> Ndk配置与Demo

    介绍 The NDK is a toolset that allows you to implement parts of your app using native-code languages s ...