маленькая книга семафоров - PullRequest
2 голосов
/ 16 февраля 2011

Ниже приведен код, в котором каждый поток должен ждать, пока каждый другой поток завершит этап рандеву, а затем ждать, пока все не завершат критическую секцию.где оба видят одно и то же значение count (может быть 0 или n).Благодаря этому два или более сигналов могут быть отправлены одновременно.Как может быть тупик в последнем тесте.Кажется, я этого не понимаю.
Это турникет, тип семафора, и автор фактически думает, что это турникет, но это семафор, и он должен работать без тупика.Подскажите пожалуйста, как в этом коде тупик!

Ответы [ 2 ]

1 голос
/ 19 октября 2015

Операторы «if» также должны находиться внутри критических секций, обозначаемых семафором «mutex», в противном случае условия гонки могут привести к тупику.

Т.е., правильный код

/* rendezvous code */
mutex.wait()
count++;
if(count==n)
        sem.signal()
mutex.signal()

sem.wait()
sem.signal()

mutex.wait()
      count--;
if(count==0)
     sem.wait()
mutex.signal()
1 голос
/ 16 февраля 2011

Я попытаюсь объяснить, как я это вижу.

Все потоки, кроме последнего, придут и будут ждать первого sem.wait ().Как только последний поток прибудет, он вызовет sem.signal () (потому что count == n), что позволит одному из ожидающих потоков (скажем, T1) продолжить.Затем T1, в свою очередь, выполнит sem.signal (), который позволит продолжить другой поток.Это что-то вроде цепной реакции.Обратите внимание, что последний поток, который пройдет, также сделает сигнал, который примет значение семафора 1. Теперь, если два потока приходят и видят, что count == 0, то попытается выполнить sem.wait ().Но поскольку значение семафора равно 1, один поток не сможет пройти, что приведет к взаимоблокировке.

...