请参与《2024年Clojure状态调查》分享您的想法![_survey]

欢迎!请查看关于页面以了解这一服务的更多信息。

0
Clojure

在1.4及最新master版本上

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

不确定这是否真的是一个bug,但文档没有提到并发安全性不足,我的预期是任何(任意交织的)with-redefs调用序列之后都会恢复原始值。

5 个回答

0

评论者:timmc

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

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

0

评论者:bendlas

据我了解,with-redefs主要用于测试套件中对vars进行模拟。当vars默认成为静态时引入了它,许多测试套件都使用了绑定进行模拟。也许文档应该修改为:使用此功能时,您必须确保只有一个线程与redef’ vars进行交互。

0

评论者:stu

找到的行性行为没有变化,文档字符串的更改将是可以接受的。

0

评论者:jafingerhut

2012年11月25日发布的补丁文件clj-1104-doc-unsafety-of-concurrent-with-redefs-v1.txt更新了with-redefs的文档字符串,以使其更清楚地表明并发使用是不安全的。

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