Читатели-писатели, использующие STM в Clojure - PullRequest
4 голосов
/ 22 ноября 2011

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

Ответы [ 3 ]

4 голосов
/ 22 ноября 2011

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

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

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

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

3 голосов
/ 23 ноября 2011

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

0 голосов
/ 23 ноября 2011

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

...