2024年Clojure状态调查!中分享您的想法。

欢迎!请参阅关于页面以了解此操作的一点点信息。

0
Clojure

在1.4和最新主版本上

user> (defn ten () 10)

'user/ten

user> (doall (pmap #(with-redefs (fn [] %) (ten)) (range 20 100)))
(20 21 22 23 24 25 34 27 28 29 30 31 32 33 34 35 36 37 38 39 39 35 42 43 44 45 48 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 79 87 88 89 90 91 92 93 94 95 97 92 98 99)
user> (ten)
79

不确定这是否是真正的错误,但文档中没有提到并发安全性不足,我的预期是指在任意交错序列的with-redefs调用之后,原始值总是被恢复。

5 个答案

0

由timmc发布的评论:

with-redefs(v1.4.0)文档说:“这些临时更改将对所有线程可见。”这听起来不安全,对吧。

一般来说,对var根绑定所做的更改不是线程安全的。

0

由bendlas发布的评论:

据我所知,with-redefs主要用于测试套件以模拟变量。当变量默认为静态时,它被引入,许多测试套件一直使用绑定来模拟。也许文档应该用类似的内容进行修改:当使用此功能时,您必须确保只有一个线程与被重新定义的变量进行交互。

0

由stu发布的评论:

行为符合,字符串更改变就好了。

0
by

评论由:jafingerhut 提出

2012 年 11 月 25 日的补丁 clj-1104-doc-unsafety-of-concurrent-with-redefs-v1.txt 更新了 with-redefs 的文档字符串,使其明确指出并行使用是不安全的。

0
by
参考:https://clojure.atlassian.net/browse/CLJ-1104 (由 jawolfe 提出)
...