在Clojure中使用STM的读者 - 作家

时间:2011-11-22 18:10:25

标签: clojure stm

有以下版本的读者 - 作者问题:多个读者和作者,2个或更多读者可以同时阅读,如果作家写作没有人可以阅读或写作,如果所有作家都有平等机会写(例如,在100轮中,5个作者应该每次写约20次)。使用STM在Clojure中实现这个的正确方法是什么?我不是在寻找完整的代码,只是一些一般的指示。

3 个答案:

答案 0 :(得分:4)

Clojure的内置STM无法真正包含您正在寻找的所有约束,因为读者永远不会等待作家并且您的要求需要读者等待。

如果您原谅不阻止读者,那么您可以继续

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

如果你需要读者阻止那么你将需要一个不同的STM,世界上有很多它们

答案 1 :(得分:3)

Clojure的STM为您提供了更好的保证。作家们互相等待,但读者仍然可以在作家写作时阅读;它只是看到最近的一致状态。如果作者还没有完成写作,那么读者根本看不到它的变化。

答案 2 :(得分:0)

正如其他答案中提到的那样,读者在阅读时不会阻止,并且您希望读者阻止,然后您可能将它们实现为“编写器”,它在回调函数中写入相同的值。我知道这是一个奇怪的解决方案,但可能会帮助你或给你一些进一步的指示。