У меня есть некоторый не поточно-безопасный код (средство записи общих данных), который можно вызывать только из нескольких потоков в последовательном порядке, но я не хочу блокировать любую другую поточно-безопасную работу (несколько читателей) когда этот код не вызывается.
По сути, это ситуация блокировки типа «несколько читателей / один писатель», когда авторам необходимо исключить как читателей, так и других писателей.
т.е. У меня есть две функции:
(defn reader-function [] ....) // only reads from shared data
(defn writer-function [] ....) // writes to shared data
И количество запущенных потоков (возможно, в цикле) следующее:
(do
(reader-function)
...
(writer-function))
Если какой-либо отдельный поток выполняет функцию записи, все остальные потоки должны блокироваться. то есть в любое время:
- один поток выполняет
писатель и все
другие заблокированы
- несколько тем
выполнение функции чтения, возможно, некоторые потоки
заблокировано ожидание выполнения
писатель раз все читатели закончили
Какой лучший способ добиться такой синхронизации в Clojure?