课程实验报告
题          计算机操作系统理发师问题     
姓    名 *
学    号2021 ***
年级专业2021级*
指导教师 * 华
201*年1*月  30  日
一 题目
假设有个理发店,只有一个理发师和N可供顾客等待理发的椅子,如果没有顾客,则理发师睡觉,如果有一个顾客进入理发店发现理发师在睡觉,则把他叫醒,试用信号量设计一个协调理发师和顾客的程序。
二 PV操作伪代码
C语言的伪代码实现:
intwaiting=0;//等候理发的顾客数
intchairs=n;//为顾客准备的椅子数
semaphorecustomers=0,barbers=0,mute*=1;
barber() {
    while(TRUE);//理完一人,还有顾客吗?
    P(cutomers);//假设无顾客,理发师睡眠
    P(mute*);//进程互斥
    waiting-=1;//等候顾客数少一个
    V(barbers);//理发师去为一个顾客理发
    V(mute*);//开放临界区
    cut-hair();//正在理发
}
customer() {
    P(mute*);//进程互斥
    if(waiting) { 
    waiting+=1;//等候顾客数加1
    V(customers);//必要的话唤醒理发师 
    V(mute*);//开放临界区 
    P(barbers);//无理发师,顾客坐着养神 
    get-haircut();//一个顾客坐下等理/
    }
    elseV(mute*);//人满了,离开
}
三 程序流程图
顾客模块:
理发师模块:
四 源程序的实现
因为本人对C++的多线程库函数不了解,于是使用JAVA实现理发师问题,假设有5可供顾客理发的椅子:
package .sw*y;
import urrent.Semaphore;//导入Semaphore,用于控制进程同步互斥的量。
publicclass BarberShop {
staticintt = 0;// 顾客
staticintMA* = 5;// 假设5可供顾客理发的椅子
staticintbusy = 0;
static Semaphore mute* = new Semaphore(1);// 临界区互斥信号量(二进制信号量),相当于互斥锁。
publicstaticvoid main(String args[]) throws InterruptedE*ception {
        BarberShop bar = new BarberShop();
for (int i = 1; i <= 20; i++) {// 假设一共有20个顾客来访
new Thread(new Barber(bar, i)).start();
            Thread.sleep((int) (400 - Math.random() * 300));// 使得当前线程休眠 随机0-0.1s
        }
    }
publicsynchronizedboolean isFull() {
if (t == MA*) {
returntrue;
        }计算机专业java
returnfalse;
    }
publicsynchronizedboolean isEmpty() {
if (t == 0) {
returntrue;
        }
returnfalse;
    }
publicsynchronizedboolean isBusy() {
if (busy == 1) {
returntrue;
        }
returnfalse;
    }
publicvoid Gobar(int inde*) throws InterruptedE*ception {
        System.out.println("顾客 " + inde* + " 来了");
t++;
// 判断是否满
if (isFull()) {
            System.out.println("没有可供顾客等待的椅子了," + "顾客 " + inde* + " 离开了");