Семафор C++ (чтение/запись)

У меня был вопрос о цепочках чтения/записи, и я не хотел все усложнять, поэтому я пришел сюда за советом.

У меня есть массив, который в конечном итоге будет прочитан 4 потоками и записан 3. (1 читатель 3 чтения/записи). Моя цель состояла в том, чтобы каким-то образом никакая операция чтения не блокировала другой поток, в то время как любая операция записи блокировала все потоки до завершения. Я почти уверен, что знаю, как это сделать с одним семафором на поток, но есть ли способ сделать это с одним двоичным, счетным или мьютексным семафором (или чем-то меньшим, чем 1 семафор на поток). Я буду использовать библиотеку семафоров VxWorks.


person SirRoot    schedule 01.02.2013    source источник


Ответы (2)


Если только VxWorks не поддерживает какой-либо тип shared/rwlock, подобный POSIX, я боюсь, что это будет немного сложнее, чем просто.

Я бы предложил использовать POSIX pthread_rwlock_t, если он у вас есть. Если вы этого не сделаете и VxWorks не предлагает эквивалентной альтернативы, вам придется создать ее, используя другие примитивы. Можно построить rwlock поверх 2 семафоров, 3 мьютексов и двух целочисленных переменных. См. Параллельное управление с помощью "Читающих" и "Писающих"; П.Дж. Куртуа, Ф. Хейманс и Д.Л. Парнас; Исследовательская лаборатория МБЛЭ; Брюссель, Бельгия.

person wilx    schedule 01.02.2013
comment
На самом деле это то, что искали, к сожалению, это поддерживается только vxWorks 6.6 и более поздними версиями, в противном случае, как предположили другие, это проблема «читателей и писателей». - person SirRoot; 01.02.2013

Поскольку у вас есть только один считыватель, это точно эквивалентно проблеме взаимного исключения (может быть только один поток). Должно быть достаточно прямого использования одного двоичного семафора. Начните с единицы, P при входе, V при выходе.

person zch    schedule 01.02.2013
comment
Потоки чтения/записи пишут только в определенном сценарии, поэтому они будут читать гораздо чаще, чем писать. Я надеялся, что 4 потока не будут блокировать друг друга при чтении. - person SirRoot; 01.02.2013