面包师问题
一、问题描述:
面包师有很多面包和蛋糕,由 n 个销售人员销售。
每个顾客进店后先取一个号,并且等着叫号。
当一个销售人员空闲下来,就叫下一个号。
请分别编写销售人员和顾客进程的程序。
二、程序实现
由于取号和叫号都属于临界资源,所以用2个互斥信号量来进行表示.
semaphore mutex_c = 1; //控制取号的互斥访问
semaphore mutex_s = 1; //控制
semaphore count_c = 0; //顾客取得的号数
semaphore count_s = 0; //销售人员呼叫的号数
semaphore sale = n; //销售人员数
semaphore customer = 0; //顾客数
void Customer() {
P(mutex_c); //申请访问取号资源
count_c++; //获得号码
V(mutex_c) //释放资源
V(customer);
P(sale); //等待销售人员
进行消费,然后离开;
}
void Sale() {
P(customer); //等待顾客
P(mutex_s); //申请叫号资源
count_s++;
呼叫号码为 count_s 的顾客;
V(mutex_s); //释放资源
V(sale);
}