【问题标题】:Readers-writers using STM in Clojure在 Clojure 中使用 STM 的读写器
【发布时间】:2011-11-22 18:10:25
【问题描述】:

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

【问题讨论】:

    标签: clojure stm


    【解决方案1】:

    Clojure 的内置 STM 并不能真正包含您正在寻找的所有约束,因为读者从不等待作者,而您的要求需要读者等待。

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

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

    如果您需要读者屏蔽,那么您将需要一个不同的 STM,世界上有很多这样的人

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-12-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-04
          相关资源
          最近更新 更多