Читатели-писатели, использующие STM в Clojure

Существует следующая версия проблемы «читатели-писатели»: несколько читателей и писателей, 2 или более читателей могут читать одновременно, если пишет писатель, никто не может ни читать, ни писать, желательно, чтобы все писатели имели равные шансы писать (для например, в 100 раундах 5 писателей должны написать около 20 раз каждый). Как правильно реализовать это в Clojure с помощью STM? Я не ищу полный код, просто некоторые общие указания.


person bvk256    schedule 22.11.2011    source источник


Ответы (3)


Clojure STM дает гораздо лучшие гарантии. Писатели ждут друг друга, но читатели могут читать, пока писатель пишет; он просто видит самое последнее согласованное состояние. Если писатель еще не закончил писать, читатель вообще не увидит его изменений.

person amalloy    schedule 22.11.2011

Встроенная в Clojure STM не может реально включить все ограничения, которые вы ищете, потому что читатели никогда не ждут авторов, а ваши требования требуют, чтобы читатели ждали.

если вы можете простить, что не блокируете читателей, тогда вы можете пойти дальше и

(. (java.lang.Thread. #(dosync (write stuff)) start))
(. (java.lang.Thread. #(dosync (read stuff)) start))

если вам нужны читатели для блокировки, вам понадобится другой STM, в мире их много

person Arthur Ulfeldt    schedule 22.11.2011

Как упоминалось в других ответах, которые читатели не блокируют во время чтения, и вы хотите, чтобы читатель блокировался, тогда вы, вероятно, реализуете их как «писатель», который записывает то же значение, которое он получает в своей функции обратного вызова. Я знаю, что это странное решение, но, возможно, это может помочь вам или дать вам дополнительные указания.

person Ankur    schedule 23.11.2011