生产者消费者问题
设信号量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. 练习五十七:for循环 809??=800*?+9*?+1其中?代表的两位数,8*?的结果为两位数,9*?的结果为3位数。求?代表的两位数,及809??后的结果

    题目:809??=800*?+9*?+1其中?代表的两位数,8*?的结果为两位数,9*?的结果为3位数.求?代表的两位数,及809??后的结果 注意:一定要看清楚题目哦,809??代表的是结果,?代表 ...

  2. layim和Gatewayworker组合的实时通讯

    今天是第二次重新开发使用layim和Gatewayworker,但是由于第一次没有写文档,导致这一次就跟第一次一样,一头雾水,重新开始看文档研究,导致遇到一个瓶颈,怎么都过不去.所以,以这篇文章开始, ...

  3. 5-----BBS论坛

    BBS论坛(五) 5.1.cms后台修改密码功能完成 (1)新建app/forms.py # app/forms.py from wtforms import Form class BaseForm( ...

  4. Sublime text中文乱码解决办法

    ConvertToUTF8 安装这个插件可以解决编码混乱问题 首先必须先配一下Sublime text ,安装 Package Control 1.  用Sublimt text 打开任意一个文件,C ...

  5. IA-32e模式下的异常处理

    系统异常处理 CPU如果调用系统异常处理程序 需要的数据结构 IDT_Table: 中断向量表, 在中断向量表中的每一项都是一个中断描述符(中断门或者陷阱门), 一个中断描述符中的几位是段选择符 GD ...

  6. MakeFile基本使用

    MakeFile Making makefile demo # Run this line when useing `make` command # default is the target whi ...

  7. SSH密钥登录原理

    Client 发送请求 login 请求 --> Server 接受请求 --> 根据 authorized_key 文件中的对应 Client 的 ip 地址的公钥对一串随机数进行加密 ...

  8. etc

    小小的注意点们 交换两个变量的值时, 如果使用异或运算符, 需要先判断两个数是否相等 if (a == b) return; a ^= b; b = a ^ b; a ^= b; 取一个数组的中间位置 ...

  9. HDU 2389 ——Rain on your Parade——————【Hopcroft-Karp求最大匹配、sqrt(n)*e复杂度】

    Rain on your Parade Time Limit:3000MS     Memory Limit:165535KB     64bit IO Format:%I64d & %I64 ...

  10. java-logic====吃货联盟

    1.系统界面 2.功能一 3.查看餐袋 4.签收订单 5.删除订单 6.我要点赞 主要分在两个类中: 第一个类entity,主要的是一些共有的属性 主要代码: public class entity ...