答案:本题使用 3 个信号量和一个控制变量:控制变量 waiting 用来记录等候理发的顾客数,初值为 0;信号量 customers 用来记录等候理发的顾客数,并用作阻塞理发师进程,初值为 0;信号量 barbers 用来记录正在等候顾客的理发师数,并用作阻塞顾客进程,初值为 0;信号量 mutex 用于互斥,初值为 1。同步算法描述如下:Semaphore customers=0;/*等候理发的顾客数*/Semaphore barberers=0;/*等候顾客的理发师数*/Semaphore mutex=1;Int waiting=0;Main(){ cobeginBarbers();Customers();Coend}Barber(){While(true){Wait(customers); /*是否有等候的顾客*/Wait(mutex);Waiting=waiting-1; /*顾客数减 1*/Signal(barbers); /*理发师开始理发*/Signal(mutex);理发;}}Customer(){Wait(mutex);If(waiting<N){Waiting=waiting+1; /*若有空椅子,等候的顾客数加 1*/Signal(customers);Signal(mutex);Wait(barbers);坐下等候服务;}Else{Signal(mutex); /*无空椅子则离开*/}}