Я реализовывал предпочитающую запись запись R / W блокировку в C с потоками SDL и мьютексом. Я проверил Википедию для реализации псевдокода :
Входные данные для Reader и Writer: mutex mu, условная переменная cond, integer readerWaiting = 0 и логическое writerWaiting = false.
Считыватель:
- Блокировка му
- Пока writerWaiting имеет значение:
- Увеличение числа читателей Ожидание
- Операция чтения
- Уменьшение количества читателей Ожидание
- Во время чтения читателей Ожидание> 0:
- Уведомить cond (сигнал)
- Unlock mu
Writer:
- Блокировка mu
- Пока writerWaiting имеет значение true:
- Операция записи
- Установите для writerWaiting значение true
- Пока читатели ждут> 0:
- Установите для WriterWaiting значение false
- Уведомить cond (широковещание)
- Разблокировать му
Я полагаю, что SDL удовлетворяет этому требованию
wait: это стандартная операция ожидания над условными переменными, которая, среди других действий, освобождает мьютекс m
Мой вопрос, это правильно? Потому что я попробовал это с одним потребительским потоком и с одним и несколькими производственными потоками, и это не сработало;потребитель заблокирует, и очередь не опустеет. Я почти уверен, что моя реализация была такой же, как псевдокод, но вместо этого я пришел к своей собственной системе.
Подумав об этом сейчас, это может быть из-за того, как моя операция чтения обработалапустая очередь.
Кроме того, кто-нибудь может объяснить, что означает это предложение из статьи?
Каждая из блокировок для чтения и блокировки для записи имеет свою собственную обратную операцию.