2024 年 Clojure 调查中分享你的想法!

欢迎!请查阅关于页面以了解更多有关此页面如何运作的信息。

0
Clojure

在 1.4 及最新 master 版本上

user> (defn ten () 10)

'user/ten

user> (doall (pmap #(with-redefs (fn [] ten) (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 主要是用于测试套件以模拟 vars。它是在 vars 默认为静态之后引入的,许多测试套件已经使用绑定进行模拟。可能文档字符串应修改为:使用此工具时,必须确保只有一个线程与重定义的 vars 交互。

0

评论者:stu

行为保持不变,文档字符串的修改是可行的。

0
by

评论者:jafingerhut

补丁文件 patch-clj-1104-doc-unsafety-of-concurrent-with-redefs-v1.txt,日期为2012年11月25日,更新了 with-redefs 的文档字符串,使并发使用不安全的问题更加清晰。

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