Я бы сказал, нет, текущий метод не в порядке.
В частности, скажем, тип 0 входит и получает через ввод. Тип 1 затем проходит до выхода типа 0. Он попадает в мьютекс, обнаруживает, что тип процесса неверен, и блокируется на m1. Затем вводится тип 0, разблокируется m, сбрасывается тип процесса, и блокировка на m1 все еще действует.
Кроме того, если у вас есть 2 процесса типа 0 ввода, первый из них завершится, и тип запущенного процесса будет сброшен, пока процессы все еще находятся в критической секции.
Я предполагаю, что «вверх» похоже на разблокировку, а «вниз» похоже на блокировку; это звучит как набор методов, предназначенных для семафора. Я также делаю предположение, что для системы есть только два мьютекса (m и m1); поскольку разметка не совсем понятна в этом отношении.
РЕДАКТИРОВАТЬ: Предложение, которое вы предложили, будет выглядеть примерно так:
shared: this.type = -1;
mutex m, m1=1;
count=0;
enter{
down(m)
if (this.type == process.type) up(m1)
down(m1)
this.type= process.type
count++;
up(m)
}
exit {
count--;
if(count==0) this.type = -1
up(m1)
}
Это все еще имеет проблему с тем, что выход не является потокобезопасным при изменении состояния; и что, когда новый Процесс пробуждается / начинает выполняться, его братья не пробуждаются.
Я не совсем уверен, что есть безопасный способ сделать это без условных переменных; если нет больше информации о проблеме. (т.е. это в контексте «Монитора», где выполнение метода уже поточно-ориентированное)