有以下版本的读写器问题:多个读写器,2 个或多个读者可以同时读取,如果一个作者在写,没有人可以读写,最好是所有作者都有平等的写作机会(对于例如在 100 轮中,5 位作者每人应该写大约 20 次)。使用 STM 在 Clojure 中实现此功能的正确方法是什么?我不是在寻找一个完整的代码,只是一些一般的方向。
问问题
224 次
3 回答
4
Clojure 的内置 STM 并不能真正包含您正在寻找的所有约束,因为读者从不等待作者,而您的要求需要读者等待。
如果您可以原谅不阻止读者,那么您可以继续
(. (java.lang.Thread. #(dosync (write stuff)) start))
(. (java.lang.Thread. #(dosync (read stuff)) start))
如果您需要读者屏蔽,那么您将需要一个不同的 STM,世界上有很多
于 2011-11-22T18:52:01.757 回答
3
Clojure 的 STM 为您提供了比这更好的保证。写者之间相互等待,但读者在写者写作时仍然可以阅读;它只看到最近的一致状态。如果作者还没有写完,读者根本看不到它的变化。
于 2011-11-22T20:49:01.640 回答
0
正如其他答案中提到的那样,读者在阅读时不会阻塞并且您希望读者阻塞然后您可能将它们实现为“编写器”,它写入它在其回调函数中获得的相同值。我知道这是一个奇怪的解决方案,但可能这可以帮助你或给你一些进一步的方向。
于 2011-11-23T05:04:56.047 回答