gpt4 book ai didi

concurrency - 原子与引用有何不同?

转载 作者:行者123 更新时间:2023-12-03 04:38:32 25 4
gpt4 key购买 nike

atom 和 refs 实际有何不同?

我了解原子的声明方式不同,并通过 swap! 进行更新函数,而 refs 使用 alter里面 dosync然而,内部实现似乎非常相似,这让我想知道为什么我会使用其中一个而不是另一个。

例如,原子 ( http://clojure.org/atoms ) 的文档页面指出:

Internally, swap! reads the current value, applies the function to it, and attempts to compare-and-set it in. Since another thread may have changed the value in the intervening time, it may have to retry, and does so in a spin loop. The net effect is that the value will always be the result of the application of the supplied function to a current value, atomically. However, because the function might be called multiple times, it must be free of side effects.

所描述的方法听起来与用于引用的 STM 非常相似。

最佳答案

不同之处在于您无法协调多个原子之间的更改,但可以协调多个引用之间的更改。

引用更改必须在 dosync block 内进行。 dosync 中的所有更改都会发生,或者都不发生(原子),但这会扩展到对该 dosync 中的引用进行所有更改。这的行为很像数据库事务。

例如,您想要从一个集合中删除一项并将其添加到另一个集合中,但没有人看到两个集合都没有该项的情况。用原子不可能保证这一点,但你可以用引用来保证。

关于concurrency - 原子与引用有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18150567/

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