我今天在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.
我该如何编写一个正确返回两个值(换出和换入)的函数?
我不关心原子变化的各种值:我想知道的只是换出的值。
这可以使用保证不死锁的代码来编写,如果是这样的话,为什么?
的*调用println *只是举一个例子,但是......现在我知道*添加手表*我可以找到伟大的用途为了那个原因 ; ) – 2013-03-16 15:12:17