Java 问题代码跟踪中的信号量?
我正在研究睡眠教授场景中的一些信号量问题。它使用计数信号量模型。这些是基本准则:Java 问题代码跟踪中的信号量?,java,c,process,synchronization,semaphore,Java,C,Process,Synchronization,Semaphore,我正在研究睡眠教授场景中的一些信号量问题。它使用计数信号量模型。这些是基本准则: 候诊室(关键区域)有3把椅子。教授办公室有一把椅子,一次只能容纳一个学生 如果办公室里没有学生,教授就会睡着 当学生到达时,教授会醒来。如果教授睡着了,学生就会叫醒教授 如果学生来到等候区,所有的椅子都坐满了,学生就会离开 如果教授正忙着和另一个学生在一起,但有空位等待,那么该学生将在其中一张空闲的椅子上等待 现在,这是我为睡眠教授问题编写的伪代码: /* Counting semaphores - the int
/* Counting semaphores - the integer value represents the initial count for the semaphores */
Semaphore students = 0; /* Number of students waiting for service */
Semaphore professor = 0; /* Number of professors waiting for students */
Semaphore mutex = 1; /* Mutual exclusion when accessing the waiting room */
int waiting = 0; /* Students waiting for turn with professor */
Professor() {
while (office hours) {
wait (students); /* Go to sleep if no students */
wait (mutex); /* Get access to waiting room */
waiting = waiting - 1; /* Decrement number of waiting students */
signal (professor); /* One professor is ready */
signal (mutex); /* Releasing waiting room */
ConsultWithStudent();
}
}
Student() {
wait (mutex); /* Enter critical section, which is the waiting room */
if (waiting < 3) { /* If there are free chairs in the waiting room */
waiting = waiting + 1;
signal (students); /* Wake up professor is necessary */
signal (mutex); /* Release access to count of waiting students */
wait (professor); /* Wait for professor if not available */
GetHelpFromProfessor();
} else {
signal (mutex); /* Waiting area is full, leave without waiting */
}
}
/*计数信号量-整数值表示信号量的初始计数*/
信号量学生=0;/*等待服务的学生人数*/
信号量=0;/*等待学生的教授人数*/
信号量互斥=1;/*进入候诊室时相互排斥*/
int waiting=0;/*与教授轮候的学生*/
教授(){
(办公时间){
等待(学生);/*如果没有学生,就睡觉*/
等待(互斥);/*进入等候室*/
等待=等待-1;/*减少等待学生人数*/
信号(教授);/*一位教授准备好了*/
信号(互斥);/*释放等候室*/
ConsultWithStudent();
}
}
学生(){
等待(互斥);/*进入关键区域,即等候室*/
如果(等待<3){/*如果等待室内有免费椅子*/
等待=等待+1;
信号(学生);/*唤醒教授是必要的*/
信号(互斥);/*释放对等待学生计数的访问权限*/
等待(教授);/*如果教授不在,等待教授*/
GetHelpFromProfessor();
}否则{
信号(互斥);/*等待区已满,请不要等待*/
}
}
我已经解决了几个代码跟踪问题,我想知道我的信号量计数是否适合每一个问题:
场景1:假设教授上班时间来了,然后一个学生来了。假设教授目前正在咨询该学生。信号量计数如下所示:
信号量计数
学生1
互斥0
教授1
场景2:教授与第一个学生谈话时,又有4个学生到达。显示信号量的结果计数:
信号量计数
学生1
互斥3
教授1
场景3:教授与第一个学生结束对话,该学生离开。教授开始和第二个学生交谈。显示教授与第二个学生谈话时信号量的结果计数:
信号量计数
学生1
互斥2
教授1
有人能帮我复习一下我的工作吗?是的,这是家庭作业,在我自己从一个类似的理发师问题中生成伪代码()之后,我试图理解信号量。信号量为任意数量的许可提供了一种结构。我认为你不需要第三个信号灯“互斥”,一个用于走廊的椅子,一个用于办公室的椅子 为了集中在候车室的三把椅子上,我会设置一个有三个许可证的信号灯;在Java中类似这样:
Semaphore chairsInWaitingRoom = new Semaphore(3);
就其本身而言,在任何人被卡住等待之前,允许三个不同的调用acquire()
,因此这条线路可以在不阻塞的情况下运行三次:
chairsInWaitingRoom.acquire();
但是,当学生出现时,您可以调用tryAcquire()
,而不是调用acquire()
——如果获取许可证的尝试成功与否,这将返回true/false。如果来电者收到true
,则他们“在办公室外得到一把椅子”。如果呼叫者收到false
,则表示没有可用的椅子(这可能包括另一名学生刚刚击败他们到最后一把椅子的比赛条件)
在某个时刻,办公室里的一把椅子将是可用的,因此学生需要首先获得新椅子,然后释放他们的“走廊”椅子;可能看起来像这样:
Semaphore chairsInWaitingRoom = new Semaphore(3);
Semaphore chairInOffice = new Semaphore(1);
boolean success = chairsInWaitingRoom.tryAcquire();
if (success) {
// student was able to safely get a chair; now wait for the main office chair
chairInOffice.acquire(); // first get the new office seat, block here
chairsInWaitingRoom.release(); // then give up your hallway chair
} else {
// no more chairs were available; student leaves
}
信号量为任意数量的许可提供了一种结构。我认为你不需要第三个信号灯“互斥”,一个用于走廊的椅子,一个用于办公室的椅子 为了集中在候车室的三把椅子上,我会设置一个有三个许可证的信号灯;在Java中类似这样:
Semaphore chairsInWaitingRoom = new Semaphore(3);
就其本身而言,在任何人被卡住等待之前,允许三个不同的调用acquire()
,因此这条线路可以在不阻塞的情况下运行三次:
chairsInWaitingRoom.acquire();
但是,当学生出现时,您可以调用tryAcquire()
,而不是调用acquire()
——如果获取许可证的尝试成功与否,这将返回true/false。如果来电者收到true
,则他们“在办公室外得到一把椅子”。如果呼叫者收到false
,则表示没有可用的椅子(这可能包括另一名学生刚刚击败他们到最后一把椅子的比赛条件)
在某个时刻,办公室里的一把椅子将是可用的,因此学生需要首先获得新椅子,然后释放他们的“走廊”椅子;可能看起来像这样:
Semaphore chairsInWaitingRoom = new Semaphore(3);
Semaphore chairInOffice = new Semaphore(1);
boolean success = chairsInWaitingRoom.tryAcquire();
if (success) {
// student was able to safely get a chair; now wait for the main office chair
chairInOffice.acquire(); // first get the new office seat, block here
chairsInWaitingRoom.release(); // then give up your hallway chair
} else {
// no more chairs were available; student leaves
}