理发师问题java代码 理发师在线问答( 六 )


end
V(mutex);/*人满了,走吧!*/
end;
1、有一单向行驶的公路桥,每次只允许一辆汽车通过 。当汽车到达桥头时,若桥上无车 , 便可上桥;否则,需等待,直到桥上的汽车下桥为止 。若每一辆汽车为一进程,请用PV操作实现 。
解:汽车进程Pi(i=1,2...)
到达桥头
P(S)
上桥行驶
到达桥另一端
V(S)
信号量S的初值=1
2、有一只铁笼子,每次只能放入一只动物 。猎手向笼中放入老虎,农民向笼中放入猪,动物园等待取笼中的老虎,饭店等待取笼中的猪 。试用PV操作写出能同步执行的程序 。
解:猎手进程农民进程动物园进程饭店进程
P(S)P(S)P(S1)P(S2)
放入虎放入猪买老虎买猪
V(S1)V(S2)V(S)V(S)
信号量初值:S=1,S1=0,S2=0
操作系统中的信号量机制PV操作 , 理发店问题和生产者消费者问题有何区别没碰到过理发店问题,我看的书里没提这个问题,百度到了下面这个 。
不过如果是这个问题的话,跟生产者消费者完全没区别吧……理发师是消费者 , 顾客是生产者……
要求描述理发师和顾客的行为,因此需要两类进程Barber ()和Customer()分别描述理发师和顾客的行为 。理发师和顾客之间是同步的关系,理发师和椅子是临界资源,所以顾客之间是互斥的关系 。
引入3个信号量和一个控制变量:
1) 控制变量waiting也用于记录等候的顾客数,实际上是customers的一份拷贝 。之所以使用waiting是因为无法读取信号量的当前值,初值均为0 。
2)信号量customers用来记录等候理发的顾客数(不包括正在理发的顾客),并用作阻塞理发师进程 , 初值为0 。
3)信号量barbers用来记录正在等候顾客的理发师数(为0或1) , 并用作阻塞顾客进程 , 初值为0 。
4)信号量mutex用于互斥 , 初值为1 。
进入理发店的顾客必须先看等候的顾客数,如果少于椅子数(n),他坐下来等,否则他就离开 。
PV操作代码如下
int waiting=0 ; //等候理发的顾客数(还没理发的),0~n
semaphore customers=0, barbers=0, mutex=1;
barber() {
while(TRUE) //理完一人,还有顾客吗?
{ P(customers); //若无顾客,理发师睡眠
P(mutex); //进程互斥
waiting := waiting – 1; //等候顾客数少一个
V(barbers); //理发师去为一个顾客理发
V(mutex); //开放临界区
cut-hair( ); //正在理发(非临界区操作)
}
}
customer() { //顾客进入理发店
P(mutex); //进程互斥
if (waitingn)
{ //还有空位
waiting := waiting+1; //等候顾客数加1
V(customers); //有顾客了,如果理发师在睡则唤醒
V(mutex); //开放临界区
P(barbers); //无理发师, 顾客坐着养神
get-haircut( ); //一个顾客坐下等待理发/
}
else V(mutex); //顾客已满 , 离开
}
Linux:睡眠理发师问题(用C语言实现)/*基于信号量采用多线程技术实现进程同步*/
#include pthread.h
#include stdio.h
#include unistd.h
#include stdlib.h
#include semaphore.h
#include sys/time.h
#include math.h
#define CHAIRS 5 //椅子数
sem_t customers; //等待服务的顾客信号量
sem_t barbers;//等待顾客的理发师信号量
pthread_mutex_t mutex; //互斥变量
int waiting = 0; //正在等待的顾客数
void *barber(void *arg);
void *customer(void *num);
void cut_hair(void);
double timediff(struct timeval i,struct timeval j);
void seed_random(void);
double flat(void);
double normal(void);

推荐阅读