Существует следующая версия проблемы «читатели-писатели»: несколько читателей и писателей, 2 или более читателей могут читать одновременно, если пишет писатель, никто не может ни читать, ни писать, желательно, чтобы все писатели имели равные шансы писать (для например, в 100 раундах 5 писателей должны написать около 20 раз каждый). Как правильно реализовать это в Clojure с помощью STM? Я не ищу полный код, просто некоторые общие указания.
Читатели-писатели, использующие STM в Clojure
Ответы (3)
Clojure STM дает гораздо лучшие гарантии. Писатели ждут друг друга, но читатели могут читать, пока писатель пишет; он просто видит самое последнее согласованное состояние. Если писатель еще не закончил писать, читатель вообще не увидит его изменений.
Встроенная в Clojure STM не может реально включить все ограничения, которые вы ищете, потому что читатели никогда не ждут авторов, а ваши требования требуют, чтобы читатели ждали.
если вы можете простить, что не блокируете читателей, тогда вы можете пойти дальше и
(. (java.lang.Thread. #(dosync (write stuff)) start))
(. (java.lang.Thread. #(dosync (read stuff)) start))
если вам нужны читатели для блокировки, вам понадобится другой STM, в мире их много
Как упоминалось в других ответах, которые читатели не блокируют во время чтения, и вы хотите, чтобы читатель блокировался, тогда вы, вероятно, реализуете их как «писатель», который записывает то же значение, которое он получает в своей функции обратного вызова. Я знаю, что это странное решение, но, возможно, это может помочь вам или дать вам дополнительные указания.