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

欢迎!请参阅 关于 页面以获取更多有关如何使用本站的信息。

0
Clojure

在 1.4 和最新 master 版本上

user> (defn ten [] 10)

'user/ten

user> (doall (pmap #(with-redefs (ten (fn [] %))) (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

不确定这算不算一个bug,但文档中没有提到并发安全,而且我预期在任意 (任意交错) 的 with-redefs 调用序列之后,原始值总是会恢复。

5 个答案

0

评论者:timmc

with-redefs 文档(v1.4.0)表示“这些临时更改将在所有线程中可见。”对我来说这听起来不是线程安全的。

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

0

评论者:bendlas

据我理解,with-redefs 主要用于测试套件中模拟 vars。当 vars 默认变为静态时引入了它。很多测试套件已经使用了绑定来进行模拟。也许文档字符串应该修改为:使用此功能时,您必须确保只有一个线程与被重新定义的 vars 交互。

0
by

评论者:stu

行为查找如所见,更改文档字符串将很好。

0
by

评论者:jafingerhut

Nov 25 2012日期的补丁文件clj-1104-doc-unsafety-of-concurrent-with-redefs-v1.txt更新了with-redefs的文档字符串,使其明确表示并发使用是不安全的。

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