Clojure中使用STM的读者-写者模型

4
以下是读者写者问题的一个版本:多个读者和写者,2个或更多的读者可以同时读取,如果有一个写者正在写入,则无法读取或写入,最好所有写者都有平等的机会进行写作(例如在100轮中,5个写者应该各自写入约20次)。如何使用STM在Clojure中正确实现这一点?我不需要完整的代码,只需要一些一般的指导。
3个回答

4
Clojure的内置STM无法包含您所寻求的所有约束,因为读者永远不会等待写入者,而您的要求需要读者等待。如果您可以忽略阻塞读取器,那么可以继续操作。
(. (java.lang.Thread. #(dosync (write stuff)) start))
(. (java.lang.Thread. #(dosync (read stuff)) start))

如果您需要阻塞读取器,则需要另一个STM,世界上有很多这样的STM。

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

0

正如其他答案中提到的那样,读取器在读取时不会阻塞,如果您想要阻塞读取器,那么您可能需要将它们实现为“写入器”,该写入器在其回调函数中写入相同的值。我知道这是一个奇怪的解决方案,但也许可以帮助您或给您一些进一步的方向。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接