我在 IRC 上谈过这个问题#clojure今天的频道,但想在这里进行更详细的介绍。基本上,为了更好地理解原子,swap!
, deref
和 Clojure 并发作为一个整体,我想尝试编写一个函数,它不仅返回使用交换的值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!
之间有相同的原子@a
deref
并致电swap!
那么我可能会换出一个不是 42 的值。
如何编写一个函数来正确返回两个值(换出的值和换入的值)?
我不关心原子改变的各种值:我想知道的是换出的值是什么。
可以使用保证不会死锁的代码来编写此代码吗?如果可以,为什么?
Clojure 的swap!
只是一个旋转的比较和设置。您可以定义一个替代版本来返回您喜欢的任何内容:
(defn alternate-swap [atom f & args]
(loop []
(let [old @atom
new (apply f old args)]
(if (compare-and-set! atom old new)
[old new] ; return value
(recur)))))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)