我今天在 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!
之间执行相同的原子,那么我可能会换出一个不是 42 的值。@a
deref
swap!
如何编写一个正确返回两个值(换出和换入)的函数?
我不关心原子确实更改为的各种值:我只想知道换出的值是什么。
这可以使用保证不会死锁的代码来编写吗?如果可以,为什么?