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

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

0票数
Clojure
{{thread-bound?}} 为线程本地绑定返回 true,即使这些绑定不是由当前线程绑定的。这与文档字符串相反,文档字符串表示如果返回 true,则 {{set!}} 应该成功。

这是一个示例 REPL 会话,其中一个线程建立了一个绑定,这些绑定被传送到第二个线程,第二个线程检查 thread-bound? 以查看是否可以设置绑定,thread-bound? 返回 true,表明可以设置绑定,第二个线程尝试设置绑定,并且第二个线程收到一个 IllegalStateException


    Clojure 1.5.1
    user=> (def ^:dynamic *set-me* nil)
    #'user/*set-me*
    user=> (defn try-to-set [] (binding [*set-me* 1] (doall (pcalls #(if (thread-bound? #'*set-me*) (set! *set-me* (inc *set-me*)))))))
    #'user/try-to-set
    user=> (try-to-set)
    IllegalStateException 无法设置:*set-me* 从非绑定线程 clojure.lang.Var.set (Var.java:230)
    user=>


*方法:* 当存在绑定且那个绑定不是由当前线程建立的时,thread-bound? 应该返回 false。该补丁为 Var 添加了一个新功能,因为核心没有看到非公开的 Var$TBox 的可见性。

*补丁:* thread-bound.diff

*审核人:* Alex Miller

4 个答案

0票数

评论者:pjstadig

我附带了一个补丁,该补丁更改 clojure.lang.Var 和 clojure.core/thread-bound?,以仅在 Var 可以设置为 true 时返回。

0票数

评论者:alexmiller

REPL 例子?

0票数

评论者:joegallo

当然,亚历克斯,这是我今早运行的一个复制品例。

`; nREPL 0.1.7
用户» (def ^:dynamic 设置我 nil)

'用户/设置我

用户» (defn 尝试设置 [] (binding [*设置我* 1] (doall (pcalls #(if (thread-bound? #'设置我) (set! 设置我 (inc 设置我)))))))

'用户/尝试设置

用户» (尝试设置)
IllegalStateException 无法设置:从非绑定线程设置 设置我 clojure.lang.Var.set (Var.java:230)
用户»

0票数
参考: https://clojure.atlassian.net/browse/CLJ-1077 (由 pjstadig 报告)
...