我还找到我的特定问题的解决方案。 我将将其修订为一般问题陈述,以防这可能是一个有效的考虑支持的用例。
所以基本问题与 swap! 解决冲突的方式有关。 我用以下代码演示了这一点
(def d (atom 0))
(pmap (fn [_] (swap! d (fn [x] (println "x:" x) (inc x)))) (range 10))
x: x: 0
0x: x:x: 0
x: x: 011
0x: 0
x: 1
x: 2x
0x: 1
x: 2
x: 2x
x: x:3
x: x: 2
4x: x: 24x
x: 2
x: 2
输入:输入:5 2
5
5
2x
输入:输入:输入:6
6
5
76x
x
7
7
输入:输入:8
8
9
=> (1 10 2 9 4 3 6 5 8 7)
最终结果正确(递增了10个值),但是得到了30多次以上的交换功能应用,内部状态有许多重复(例如,“0”)。我可以猜测swap!在内部并行运行函数,但在出现冲突时重复其中一些。
如果我们把这个问题转到缓存上,有些情况下,c/through-cache看到see? = false的并行实例,因此运行miss分支,然后在更新冲突时重新运行。
这没问题,尽管我可能仍然会争辩说,至少文档字符串很令人困惑,应该指出这仅与单线程执行相关。
我将提出第二个评论,概述一个问题陈述和解决问题的潜在方案。