Ниже приведен код, в котором каждый поток должен ждать, пока другой поток завершит этап рандеву, а затем ждать, пока все завершат критическую секцию.
/* rendezvous code */
mutex.wait()
count++;
mutex_signal()
if(count==n)
sem.signal()
sem.wait()
sem.signal()
mutex.wait()
count--;
mutex.signal()
if(count==0)
sem.wait()
Я знаю, что два процесса могут достичь случая, когда оба видят одно и то же значение счетчика (может быть 0 или n). Благодаря этому два или более сигналов могут быть отправлены одновременно. Как может быть тупик в последнем тесте. Кажется, я этого не понимаю.
Это схема семафора типа турникета, и автор на самом деле думает, что это турникет, но это семафор, и он должен работать без взаимоблокировок. Скажите, пожалуйста, как в этом коде есть взаимоблокировка!