Я реализую веб-приложение, которое хранит некоторые данные в памяти. Некоторые запросы читают эти данные для обработки, а некоторые запросы обновляют эти данные.Lock-Writer Lock в Haskell
В этом случае несколько считывателей могут одновременно работать с данными, но писателю нужен эксклюзивный доступ к данным в памяти. Я хочу реализовать reader-writer lock для решения этой проблемы. Я также хочу, чтобы свойство справедливости заключалось в том, что официанты на блокировке обрабатываются в порядке FIFO, чтобы избежать голода и голода.
Стандартные библиотеки Haskell не обеспечивают такую функциональность. Я обнаружил, что concurrency-extra
дает эту функциональность, но библиотека, кажется, не поддерживается (и была удалена из stackage после LTS 3.22) - и ее свойства справедливости мне не понятны.
Я нахожу это немного удивительным, что в стандартных библиотеках haskell и в стеллаже нет библиотеки блокировки читателя-писателя - не является ли шаблон чтения-записи распространенным во многих программах? Или существует совершенно другой (возможно, незакрепленный) подход, который предпочтительнее в Haskell?
EDIT: Точнее на собственность справедливости, когда писатель блокируется в ожидании получения блокировки, последующие запросы чтения блокировка должна быть разрешена только после того, как писатель приобретает и освобождает от записи замок - подобный MVar
с свойство справедливости - MVar
s have a FIFO property
Почему не 'Control.Concurrent.MVar' (с помощью' takeMVar ')? – josejuan
Несколько читателей не могут одновременно работать, если все они должны принять MVar. В моем сценарии несколько читателей могут работать с данными, но писателю нужен эксклюзивный доступ. – donatello
Я предполагаю, что, поскольку у нас есть STM и 'TVar', теперь более простые формы блокировки больше не нужны. Вы можете использовать «TVar's» и STM или реализовать свою блокировку поверх «MVar's». (последний выглядит нетривиальным) – chi