我有一些非线程安全的代码(用于写入共享数据),只能以串行方式从多个线程调用,但当不调用此代码时,我不想阻塞任何其他线程安全工作(多个读者)。
这实质上是一种多读单写类型的锁定情况,其中作者需要排除读者和其他作者。
即我有两个函数:
(defn reader-function [] ....) // only reads from shared data
(defn writer-function [] ....) // writes to shared data
有一些正在运行的线程(可能在循环中),执行以下操作:
(do
(reader-function)
...
(writer-function))
如果任何一个线程正在执行写入函数,那么所有其他线程都必须阻塞。也就是说,在任何时候:
- 一个线程正在执行写入,而所有其他线程都处于阻塞状态
- 多个线程正在执行读取函数,可能有一些线程正在等待执行写入函数,直到所有读取操作完成后再执行
在Clojure中实现这种同步的最佳方法是什么?