Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 问题代码跟踪中的信号量?_Java_C_Process_Synchronization_Semaphore - Fatal编程技术网

Java 问题代码跟踪中的信号量?

Java 问题代码跟踪中的信号量?,java,c,process,synchronization,semaphore,Java,C,Process,Synchronization,Semaphore,我正在研究睡眠教授场景中的一些信号量问题。它使用计数信号量模型。这些是基本准则: 候诊室(关键区域)有3把椅子。教授办公室有一把椅子,一次只能容纳一个学生 如果办公室里没有学生,教授就会睡着 当学生到达时,教授会醒来。如果教授睡着了,学生就会叫醒教授 如果学生来到等候区,所有的椅子都坐满了,学生就会离开 如果教授正忙着和另一个学生在一起,但有空位等待,那么该学生将在其中一张空闲的椅子上等待 现在,这是我为睡眠教授问题编写的伪代码: /* Counting semaphores - the int

我正在研究睡眠教授场景中的一些信号量问题。它使用计数信号量模型。这些是基本准则:

  • 候诊室(关键区域)有3把椅子。教授办公室有一把椅子,一次只能容纳一个学生
  • 如果办公室里没有学生,教授就会睡着
  • 当学生到达时,教授会醒来。如果教授睡着了,学生就会叫醒教授
  • 如果学生来到等候区,所有的椅子都坐满了,学生就会离开
  • 如果教授正忙着和另一个学生在一起,但有空位等待,那么该学生将在其中一张空闲的椅子上等待
  • 现在,这是我为睡眠教授问题编写的伪代码:

    /* 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
    }