Правильно ли реализована блокировка чтения-записи в Википедии? - PullRequest
1 голос
/ 14 октября 2019

Я реализовывал предпочитающую запись запись R / W блокировку в C с потоками SDL и мьютексом. Я проверил Википедию для реализации псевдокода :


Входные данные для Reader и Writer: mutex mu, условная переменная cond, integer readerWaiting = 0 и логическое writerWaiting = false.

Считыватель:

  • Блокировка му
  • Пока writerWaiting имеет значение:
    • ожидание, мю [a]
  • Увеличение числа читателей Ожидание
  • Операция чтения
  • Уменьшение количества читателей Ожидание
  • Во время чтения читателей Ожидание> 0:
    • Ожидание, мю
  • Уведомить cond (сигнал)
  • Unlock mu

Writer:

  • Блокировка mu
  • Пока writerWaiting имеет значение true:
    • wait cond, mu
  • Операция записи
  • Установите для writerWaiting значение true
  • Пока читатели ждут> 0:
    • ожидают, мю
  • Установите для WriterWaiting значение false
  • Уведомить cond (широковещание)
  • Разблокировать му

Я полагаю, что SDL удовлетворяет этому требованию

wait: это стандартная операция ожидания над условными переменными, которая, среди других действий, освобождает мьютекс m

Мой вопрос, это правильно? Потому что я попробовал это с одним потребительским потоком и с одним и несколькими производственными потоками, и это не сработало;потребитель заблокирует, и очередь не опустеет. Я почти уверен, что моя реализация была такой же, как псевдокод, но вместо этого я пришел к своей собственной системе.

Подумав об этом сейчас, это может быть из-за того, как моя операция чтения обработалапустая очередь.

Кроме того, кто-нибудь может объяснить, что означает это предложение из статьи?

Каждая из блокировок для чтения и блокировки для записи имеет свою собственную обратную операцию.

1 Ответ

2 голосов
/ 14 октября 2019

Реализация ужасно нарушена во многих отношениях. Я просто укажу самое очевидное: читатели читают, удерживая замок. Так что нет никакой возможности, что он может даже поддерживать несколько одновременных читателей!

Учитывая, что он вообще не может быть даже блокировкой чтения / записи, анализ других проблем кажется довольно бессмысленным. Неудивительно, что он также не может отдавать предпочтение авторам, поскольку автор не может установить writerWaiting в значение true, пока нет читателей.

Кстати, реализация двух мьютексов на этой странице также ужасно нарушена. * вздыхает *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...