理发师问题
来源:互联网 发布:mac缺少flash插件 编辑:程序博客网 时间:2024/04/30 23:58
理发师问题:
一个理发店由一个有几张椅子的等待室和一个放有一张理发椅的理发室组成。
1. 若没有要理发的顾客,则理发师去睡觉;
2. 若一顾客进入理发店,理发师正在为别人理发,且等待室有空椅子,则该顾客就找张椅子按顺序坐下;
3. 若一顾客进入理发店,理发师在睡觉,则叫醒理发师为该顾客理发;
4. 若一顾客进入理发店且所有椅子都被占用了,则该顾客就离开。
这是一个比较复杂的进程同步问题。需要设计两个进程:
*顾客进程Customer()
*理发师进程Barber()
特定义两个信号量customers和barbers实现进程的同步,并定义信号量S实现进程的互斥。
代码如下:
Begin
//定义信号量并初始化
int CHAIRS:=n //为等候的顾客准备的椅子数
信号量: customers=0;
barbers=0;
cut=0;
finish=0;
mutex=1; //用于互斥的信号量
int waiting=0;
Cobegin
//定义并发进程
Process Customer()
{
P(mutex);
If(waiting>CHAIRS)
then
V(mutex) //没有空椅子,离开
Else
{
Aiting=waiting+1;
V(mutex);
V(customers); //唤醒理发师
SIT_ON_chair(); //坐在椅子上等候
P(barbers); //等待理发师召唤
Stand_up(); //从椅子上起身
}
P(mutex);
waiting=waiting-1;
V(mutex);
SIT_ON_cut_chair(); //坐在理发椅上
V(cut); //告诉理发师可以开始理发
P(finish); //等待理发完成
}
void Barber()
{
While(T)
{
P(customers); //等待顾客到来
Clear_cut_chair(); //整理一下理发椅子
V(barbers); //召唤一个顾客
P(cut); //等待顾客就坐
CUT_hair(); //理发
V(finish); //告诉顾客已结束
}
}
Coend
//并发进程的定义结束
End
注意:代码中蓝字的部分可以从顾客进程移到理发师进程中处理
- 理发师问题
- 理发师问题
- 理发师问题
- 理发师问题
- 理发师问题
- 理发师问题
- 睡眠理发师问题
- 睡眠理发师问题
- 睡眠理发师问题
- 信号量实现理发师问题
- 加强版理发师问题
- 嗜睡的理发师问题
- 理发师睡眠问题
- 【操作系统】【信号量】理发师问题
- 睡眠理发师问题
- 理发师问题的实现
- 哲学家问题,理发师问题 代码
- 《理发师》
- Mac搭建PHP Phalcon框架
- linux输入子系统
- Linux内核移植 part2:uboot bootdelay参数
- 关于PF_INET和AF_INET的区别
- 分治法,动态规划及贪心算法区别
- 理发师问题
- Android实现渐显按钮的左右滑动效果
- Threejs初识-创世之旅
- Android利用Timer实现倒计时效果小demo
- CUDA并发相关(流并发、主机设备并发)
- Git 常用命令
- oracle11g 配置监听及登录问题解决方案
- 百度站长平台显示连接超时次数
- 判断浏览器