面包师问题

一、问题描述:
面包师有很多面包和蛋糕,由 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);
}