Мутекс в голодной форме в маленькой книге семафоров - PullRequest
0 голосов
/ 06 января 2020

Справочная информация:

Маленькая книга семафоров Аллена Б. Дауни рассказывает о предположениях, необходимых для предотвращения истощения потоков.

Он заявляет, что планировщик должен гарантировать следующее:

Свойство 2: если поток готов к работе, то время ожидания его запуска ограничено.

И слабый семафор гарантирует:

Свойство 3: если на семафоре ожидают потоки, когда поток выполняет сигнал, то один из ожидающих потоки должны быть разбужены.

Однако он заявляет, что даже с этими свойствами следующий код при запуске для 3 или более потоков (Поток A, B, C) может вызвать голодание:

while True: 
    mutex.wait()
    # critical section 
    mutex.signal()

Аргумент состоит в том, что если A выполняется первым, а затем активирует B, A может снова подождать мьютекс, прежде чем B освободит его. В этот момент А может снова проснуться, снова получить мьютекс и повторить этот цикл с B. C будет голодать.

Вопрос:

Не свойство 2 гарантирует, что C должен был бы разбудить планировщик в какое-то конечное время? Если это так, то тема C не может быть голодной. Даже если слабый семафор не гарантирует, что Thread C будет разбужен, разве планировщик не должен его запустить?

1 Ответ

0 голосов
/ 06 января 2020

Я подумал об этом немного больше и понял, что Свойство 2 является гарантией того, что потоки в состоянии RUNNABLE будут запланированы за конечное время.

Аргумент в книге утверждает, что Thread C никогда не перейдет в состояние RUNNABLE, поэтому свойства 2 и 3 не гарантируют отсутствие голодания.

...