经典进程同步问题:吸烟者问题
来源:互联网 发布:数据对账 英文怎么说 编辑:程序博客网 时间:2024/05/22 00:27
问题描述
假设一个系统有三个抽烟者进程和一个供应者进程。每个抽烟者不停地卷烟 并抽掉它,但是要卷起并抽掉一支烟,抽烟者需要有三种材料:烟草、纸和胶水。三个抽烟 者中,第一个拥有烟草、第二个拥有纸,第三个拥有胶水。供应者进程无限地提供三种材料, 供应者每次将两种材料放到桌子上,拥有剩下那种材料的抽烟者卷一根烟并抽掉它,并给供 应者一个信号告诉完成了,供应者就会放另外两种材料在桌上,这种过程一直重复(让三个 抽烟者轮流地抽烟)。问题分析
1) 关系分析。供应者与三个抽烟者分别是同步关系。由于供应者无法同时满足两个或 以上的抽烟者,三个抽烟者对抽烟这个动作互斥(或由三个抽烟者轮流抽烟得知2) 整理思路。显然这里有四个进程。供应者作为生产者向三个抽烟者提供材料。
3) 信号量设置。信号量offer1、offer2、offer3分别表示烟草和纸组合的资源、烟草和 胶水组合的资源、纸和胶水组合的资源。信号量finish用于互斥进行抽烟动作。
代码如下:
int random; //存储随机数semaphore offer1=0; //定义信号量对应烟草和纸组合的资源semaphore offer2=0; //定义信号量对应烟草和胶水组合的资源semaphore offer3=0; //定义信号量对应纸和胶水组合的资源semaphore finish=0; //定义信号量表示抽烟是否完成//供应者while(1){ random = 任意一个整数随机数; random=random% 3; if(random==0) V(offerl) ; //提供烟草和纸 else if(random==l) V(offer2); //提供烟草和胶水 else V(offer3) //提供纸和胶水 // 任意两种材料放在桌子上; P(finish);}//拥有烟草者while(1){ P (offer3); // 拿纸和胶水,卷成烟,抽掉; V(finish);}//拥有纸者while(1){ P(offer2); // 烟草和胶水,卷成烟,抽掉; V(finish);}//拥有胶水者while(1){ P(offer1); // 拿烟草和纸,卷成烟,抽掉; v(finish);}
0 0
- 经典进程同步问题:吸烟者问题
- 经典进程同步问题
- 经典进程同步问题
- 经典进程同步问题
- 【操作系统】吸烟者问题
- 经典进程的同步问题
- 经典进程同步问题-生产者消费者问题
- 进程的同步,互斥和经典进程同步问题
- 经典进程同步问题-生产者与消费者
- 进程同步及避免死锁经典问题
- 经典进程的同步问题自我总结
- 操作系统之经典进程同步问题
- 进程同步的经典问题3——理发师问题
- 经典进程同步问题 生产者——消费者问题
- 【操作系统总结】经典的进程同步问题-生产者消费者问题
- 经典进程同步问题:读者-写者问题
- 操作系统:经典进程同步问题(1)生产者-消费者问题
- 操作系统:经典进程同步问题(2)哲学家进餐问题
- MongoDB的索引
- lintcode(507)摆动排序 II
- Android中图片加载框架Glide解析2----从源码的角度理解Glide的执行流程
- c#中foreach的使用
- Qt Creator 窗体控件自适应窗口大小布局
- 经典进程同步问题:吸烟者问题
- 多个so文件引用起的坑
- 面试常考的常用数据结构与算法
- 随笔
- 慕课网地址
- C# sql存儲過程(Stored Procedure)分页查詢功能
- Job for postfix.service failed because the control process exited with error code. See "systemctl st
- spring的配置
- python 之正则表达式