2011-11-22 19 views
4

有以下版本的讀者和作者問題:多個讀者和作者,2個或更多的讀者可以同時讀,如果一個作者寫作沒有人可以讀或寫,所有作者都有相同的寫作機會(例如,在100輪中,每個作家應該寫出20次左右的作品)。使用STM在Clojure中實現這一點的正確方法是什麼?我不是在尋找一個完整的代碼,只是一些大方向。在Clojure中使用STM的讀者和作者

回答

3

Clojure的STM的給你比這更好的保證。作家們彼此等待,但讀者在寫作者寫作時仍然可以閱讀;它只是看到最近的一致狀態。如果一個作家還沒有完成寫作,讀者根本看不到它的變化。

4

Clojure的內置STM不能真正包含您正在尋找的所有約束條件,因爲讀者永遠不會等待作家並且您的要求需要讀者等待。

,如果你能原諒不堵的讀者,那麼你可以繼續

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

,如果你需要讀者來阻止,那麼你將需要一個不同的STM,世界上有很多,其中

0

正如其他答案中提到的,讀者在閱讀時不會阻止,並且您希望讀者阻止,那麼您可能將它們實現爲「writer」,它在其回調函數中寫入相同的值。我知道這是很奇怪的解決方案,但可能會幫助你解決問題,或者給你一些進一步的指導。