В книге Эндрю Таненбаума об операционных системах в разделе о проблеме «Потребитель / производитель» он приводит пример системы, состоящей из одного производителя, который вставляет блоки данных в буфер, и потребителя, который их получает, принимая их из буфера. Также есть счетчик, который отслеживает количество блоков данных в буфере. Когда потребитель проверяет, что счетчик равен нулю, он спит. Когда программа производит подтверждение того, что счетчик равен нулю, и помещает некоторые данные в буфер, она отправляет сигнал пробуждения потребителю.
Это может привести к гоночным условиям, хорошо известным способом, и Таненбаум дает возможное решение, используя бит ожидания пробуждения. Если потребитель получает сигнал пробуждения во время пробуждения, бит ожидания пробуждения устанавливается в единицу. Перед сном проверяет бит. Если один, он уменьшает бит до нуля и не спит.
Это решает проблему для одного производителя и одного потребителя. Но Таненбаум утверждает, что, когда задействованы три или более потоков производителя / потребителя, легко вспомнить пример, когда бит ожидания пробуждения не препятствует гоночным условиям.
Я не мог придумать такой пример, и все источники о проблеме производителя / потребителя и семафоров, кажется, избегают одной и той же точки.
Может ли кто-нибудь представить такой пример трех или более процессов (предпочтительно трех), в которых бит ожидания пробуждения не препятствует состоянию гонки?