一、问题描述:
面包师有很多面包和蛋糕,由 n 个销售人员销售。
每个顾客进店后先取一个号,并且等着叫号。
当一个销售人员空闲下来,就叫下一个号。
请分别编写销售人员和顾客进程的程序。
二、程序实现
在这个问题中,号码的 “取” 与 “叫” 都属于临界资源,可以设置两个互斥信号量mutex_j mutex_ j分别互斥的“取”、“叫”号。
(本人是一个在校学生,初学者,下面代码是自己写的,有错的话望指出!谢谢。)
semaphore mutex_i = 1; //互斥取号(每个号只能被互斥的“取”)
semaphore mutex_j = 1; //互斥叫号(每个号只能被互斥的“叫”)
semaphore snum1 = n; //销售员数量,开始时没人取号,故初值为n
semaphore cnum2 = 0; //等待被叫号的顾客数量,刚开始时还没开始取号,故初值为0
//顾客进程
consumer()
{
while(1)
{
P(snum1); //看是否有空闲的销售员
P(mutex_i); //互斥取号(取号只能一个一个的取)
取号;
V(mutex_i);
V(cnum2); //等待被叫号的顾客+1
}
}
//销售员进程
seller()
{
while(1)
{
P(cnum2); //看是否有等待被叫号的顾客
P(mutex_j); //互斥的叫号
叫号;
V(mutex_j);
V(snum1); //空闲的销售员+1
}
}