これについては、今日 IRC の#clojureチャンネルで少し話しましたが、ここでさらに詳しく説明したいと思います。swap!
基本的に、アトム、 、および Clojure の同時実行性全体をよりよく理解するために、 を使用してスワップインされた値だけでなく、スワップアウトされた値もderef
返す関数を書きたいと思います。swap!
(def foo (atom 42))
.
.
.
((fn [a]
(do
(println "swapped out: " @a)
(println "swapped in: "(swap! a rand-int)))) foo)
印刷できます:
swapped out: 42
swapped in: 14
ただし、別のスレッドがと の呼び出しのswap!
間で同じアトムを実行する場合、42 以外の値を交換している可能性があります。@a
deref
swap!
両方の値 (スワップアウトとスワップイン) を正しく返す関数を作成するにはどうすればよいですか?
アトムが変化するさまざまな値については気にしません。私が知りたいのは、交換された値が何であったかだけです。
これは、デッドロックしないことが保証されているコードを使用して記述できますか?また、そうである場合、その理由は?