проблема в параллелизме
Я бы сказал, что проблема в (отсутствии) синхронизации.В соглашении «производитель / потребитель» производитель обычно имеет средство для того, чтобы сигнализировать потребителю, что новый предмет доступен для потребления, и потребитель ждет этого сигнала, прежде чем пытаться его использовать.Подробности варьируются оттуда, но, как правило, они также включают способ, позволяющий производителю сообщить потребителю о том, что больше товаров не будет.
Ваш потребитель не ожидает какого-либо явного сигнала и не использует данныедоступно для него (длина файла), чтобы определить, что новый элемент доступен.С другой стороны, он не прилагает усилий, чтобы сохранить свое место среди потребляемых предметов, поэтому он может легко пропустить предметы, если производитель опередит их.Более того, потребитель занят циклами, выполняющими не менее дорогие операции ввода-вывода, что является очень дорогостоящим способом решения этой проблемы.
Есть ли способ заставить это работать с операторами ожидания?
Только если вы хотите, чтобы производитель работал до завершения, прежде чем потребитель что-либо потребит.Вот что делает wait()
: он ждет, пока другой процесс не завершит .В этом случае вы бы хотели, чтобы потребитель просто читал файл с начала, символ за символом, а не прыгал прямо до конца.
Если вы хотите, чтобы производитель и потребитель делали прогресс одновременно, тогда самый простойДля этого нужно использовать средства, уже предоставленные вам системой, используя FIFO или канал вместо обычного файла.Тогда производитель мог бы просто писать символ за символом, а потребитель мог просто читать символ за символом, без всякой ерунды повторного открытия и изменения положения.
Если вы должны сделать это с обычным файлом, то вы можете использовать парусемафоров или условной переменной mutex +, чтобы заставить производителя и потребителя сменяться.Альтернативно, есть различные способы, которыми потребитель может отслеживать файл, чтобы определить, когда он изменился (stat
/ fstat
, inotify
и т. Д.), Чтобы избежать ненужных попыток чтения из него, и вы можете комбинировать это сон отслеживает свою позицию в этом файле, чтобы не перечитывать данные, которые он уже использовал.В идеале ни одна из программ не открывала файл более одного раза, но производителю может потребоваться fflush
после каждой записи.