课程实验报告
题 目 计算机操作系统理发师问题
姓 名 *
学 号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* + " 离开了");
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论