gpt4 book ai didi

clojure - 为什么 Clojure 的原子交换!返回新值?

转载 作者:行者123 更新时间:2023-12-03 00:30:13 25 4
gpt4 key购买 nike

大多数原子运算符返回交换之前的先前值,例如 std::atomic::fetch_add在C++中。使用atomic int作为从0开始的全局递增id是很自然的。为什么Clojure的atom会返回交换进来的值?

(def global-counter (atom 0))
(defn next! [] (dec (swap! global-counter inc)))

是否有更好的方法在 Clojure 中创建从零开始的计数器?

最佳答案

反问:你知道为什么std::atomic::fetch_add返回交易前的值吗? (我不知道。)

调用swap!执行交易并返回其结果。在并发场景中,如果它返回交易前的值,则获取交易结果的唯一确定性方法是重复交易中的应用程序,例如。 G。

(def pre-tx (std-swap! global-counter inc))
(def tx-result (inc pre-tx))

当然,可以为交易前值弥补一个相反的例子。但是,在大多数情况下(以及您的示例情况 - 参见下文),tx-result 是与进一步引用相关的值。这就是为什么 swap! 被设计为直接返回它。对于不同的要求, ref 是合适的(除非需要使用 atom ,在这种情况下,您必须使用 compare-and- 创建自己的自旋循环设置!)。

在您的示例中,next! 应在第一次调用时返回 1,并且只要 没有理由对其进行 dec >计数是给定的示例。计数始终从一开始:如果数一,则总计数为 1。如果 next! 返回 0(虚构),last! 将返回 -1,即无效的总计数。

关于clojure - 为什么 Clojure 的原子交换!返回新值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26838348/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com