Я пытаюсь решить следующую викторину:
Слияние 3 двусторонних дорог управляется по кольцевой развязке во французском стиле так:
- правопуть для тех, кто уже едет на перекрестке с круговым движением;
- направление движения против часовой стрелки.
Каждый сектор 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);
}
Я думаю, что тупик может быть вызван, только если весь процесс попытается получить доступ ктот же сектор, верно?