面包师问题

    科技2025-10-09  16

    面包师问题

    2020/10/8 16:02

    问题

    面包师问题。 面包师有很多面包和蛋糕,由N个销售人员销售。 每个顾客进店后先取一个号,并且等着叫号。 当一个销售人员空闲下来,就叫下一个号。 试用信号量的P、V操作设计该问题的同步算法,给出所用共享变量(如果需要)和信号量及其初始值,并说明各自的含义。

    代码

    //伪代码 semaphore mutex_c=1;//互斥区号 semaphore mutex_s=1;//互斥叫号 semaphore customers = 0;//顾客数 semaphore salesmans = n;//销售人员数 int count_c=0;//顾客取号 int count_s=0;//销售人员叫号 int N;//销售人员个数 salesman() { while(true) { //确定有顾客才要叫号 P(&customers);//有顾客时 P(mutex_s);//申请叫号 count_s++;//叫号数加1 V(mutex_s);//释放 V(&salesman);//释放资源,允许顾客取号 sale(); } } customer() { //不管有没有空闲的销售人员都可以取号 P(mutex_c);//申请取号 count_c++;//取号数加1 V(mutex_c);//释放 V(&customers);//释放,有顾客光临 P(&salesman);//有空闲销售人员时 consume();//消费 }

    1.取号和叫号都属于互斥行为,不能同时又两个顾客取号,也不能同时有两个销售人员叫号,因此取号和叫号都要在临界区。 2.要有空闲的销售人员顾客才能消费,所以要等销售人员释放资源后,顾客才能消费,否则阻塞。 3.对于取号,不管有没有空闲的销售人员都可以取号,因此P(mutex_c)在P(salesman)前面,但是要有销售人员要有顾客才能叫号,因此P(mutex_s)在P(customers)后面。

    Processed: 0.038, SQL: 8