Викторина о синхронизации 3 процесса - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь решить следующую викторину: roundabout image

Слияние 3 двусторонних дорог управляется по кольцевой развязке во французском стиле так:

  1. правопуть для тех, кто уже едет на перекрестке с круговым движением;
  2. направление движения против часовой стрелки.

Каждый сектор i перекрестка с круговым движением (участок между двумя последовательными доступами i и i+1 mod3) может содержать максимальное количество автомобилей MAX_i.
Представляет поведение автомобилей при пересечении перекрестка с круговым движением.
Каждый автомобиль представлен процессом, который может вызывать три функции:

  • INPUT (i): используется для доступа извне к кольцевой развязке от доступа i;
  • СЛЕДУЮЩАЯ (i): используется для перехода из сектора i кольцевой развязки в следующий;
  • EXIT (i): используется для выхода из кольцевой развязки в конце сектора i.

Для простоты установите MAX_i = 1 для каждого сектора и упростите правило приоритета. для транспортных средств, прибывающих извне, установление того, что автомобиль может войти в кольцевой доступ, только если сектор в настоящее время не занят, а сектор не является предыдущим. Обсуждается проблема тупика.

Это мое решение, как вы думаете?

class Example {
semaphore mutex = 1;
semaphore sectors[3] = {0, 0, 0};
boolean isFree = true;

public void input (int i) {
    P(mutex);
    while (sectors[i]==0) {
        //wait for the sector
    }
    isFree = true;
    P(sectors[i]);
    V(mutex);
}

public void next (int i) {
    P(mutex);
    while (sectors[i+1]==0) {
        //wait for the next sector
    }
    isFree = true;
    V(mutex);
}

public void exit (int i) {
    P(mutex); //only 1 process can enter in the rondabout
    if (isFree) { //check the rondabout
        isFree = false;
        V(sectors[i]);
    }
    V(mutex);
}

Я думаю, что тупик может быть вызван, только если весь процесс попытается получить доступ ктот же сектор, верно?

...