Хачик наполовину прав.С ним все может быть в порядке, но его описание не так ясно, как могло бы быть.
Во-первых, когда у вас есть родительский пост allowedToRead
, вы, вероятно, хотите, чтобы он отправил readSemaphore
.
Во-вторых, ваш код позволяет родителю писать одновременно с чтением ребенка.Вы говорите, у вас есть 5 слотов.Если родитель пишет в другой слот, чем читает ребенок, тогда это нормально, я полагаю, но как ребенок определяет, где читать?Использует ли он те же переменные, что и родительский, чтобы определить, куда писать?Вам, вероятно, нужна дополнительная защита.В конце концов, я предполагаю, что разные дети читают разные слоты, поэтому, если вам нужно, чтобы они не толкали друг друга ногами, вам нужно сделать то же самое для родителей.
В-третьих, я быиспользовал мьютекс вместо семафора для allowedToRead
.
В-четвертых, что определяет, какой дочерний элемент читает, какие данные или он должен быть первым предоставлен первым, как свиньи в отстойном ведре?
Если общая память имеет 5 независимых слотов, то я бы склонен добавить переменные «следующее чтение» и «следующая запись».Защитите эти две переменные с помощью мьютекса как для производителя, так и для потребителя, а затем используйте семафоры только для того, чтобы блокировать / запускать чтение и запись, как вы уже делаете.Если бы это не было школьным упражнением, вы могли бы лучше использовать одну переменную условия, присоединенную к мьютексу, о котором я упоминал.Когда он получает сигнал, родитель проверяет, умеет ли он писать, а дети проверяют, умеют ли они читать.Когда происходит чтение или запись, подайте глобальную переменную условия, чтобы разбудить всех и проверить их условия.Преимущество этого заключается в том, что если у вас есть независимые буферные слоты, вы можете безопасно и счастливо использовать несколько потребителей одновременно.