Я собираюсь реализовать программу, в которой один родительский процесс читает текстовый файл и передает данные, которые он считывает, в буфер общей памяти, который будет считываться некоторыми дочерними процессами. Вся эта работа будет опосредована семафорами. Предположим, что родитель собирается читать по одному символу за раз из файла, а буфер общей памяти - 5 слотов.Вопрос о проблеме производителя/потребителя
Сначала я думал только имея 2 семафоры:
writeSemaphore
, инициализируется до 5, семафор, который говорит писатель, разрешен ли запись в буфер. когда он, наконец, опустится до 0, родительский процесс будет заблокирован, пока один из них не разблокирует его (после чтения некоторого блока).
readSemaphore
, инициализированный 0, является семафором, который сообщает, разрешено ли чтению из буфера читателю.
Но теперь, когда я думаю об этом, это не помешает мне иметь двух пользователей, одновременно получающих доступ к общей памяти. Я должен это предотвратить. Поэтому я ввел третий семафор:
allowedToRead
, который является либо 1, либо 0, что позволяет или блокирует доступ к дочерним процессам.
Вот псевдокод для детей и родителей:
Ребенок:
while (something) {
wait(readSemaphore)
wait(allowedToRead)
<<read from shared memory>>
post(allowedToRead)
post(writeSemaphore)
}
Родитель:
while (something) {
wait(writeSemaphore)
<<writes to shared memory>>
post(allowedToRead)
}
ли мои рассуждения правильно?
Благодаря
Вы можете найти Boost.Interprocess полезно, чтобы сэкономить вам тяжелую работу при работе с общей памятью. Существуют прямые потоковые поточные процессы, описанные здесь: http://www.boost.org/doc/libs/1_45_0/doc/html/interprocess/streams.html – 2010-12-04 18:33:01
Это для школы, поэтому никакого повышения для меня нет. – 2010-12-04 18:59:59