Справочная информация:
Маленькая книга семафоров Аллена Б. Дауни рассказывает о предположениях, необходимых для предотвращения истощения потоков.
Он заявляет, что планировщик должен гарантировать следующее:
Свойство 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 будет разбужен, разве планировщик не должен его запустить?