Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Concurrency 用单个值更新原子_Concurrency_Clojure_Atomic - Fatal编程技术网

Concurrency 用单个值更新原子

Concurrency 用单个值更新原子,concurrency,clojure,atomic,Concurrency,Clojure,Atomic,我的代码中有许多原子,其中一个共同的要求是将它们更新为新值,而不管当前值如何 因此,我发现自己在写这样的东西: (swap! atom-name (fn [_] (identity new-value))) 这是可行的,但看起来相当丑陋,可能会因为构造匿名闭包而导致性能损失 有更好的方法吗?重置函数应该这样做 (reset! atom-name new-value) 您可以使用(比较并设置atom旧值和新值) 但我觉得奇怪的是,你需要把它们改变成不相关的值。你不能使用绑定或类似的东西。太棒了

我的代码中有许多原子,其中一个共同的要求是将它们更新为新值,而不管当前值如何

因此,我发现自己在写这样的东西:

(swap! atom-name (fn [_] (identity new-value)))
这是可行的,但看起来相当丑陋,可能会因为构造匿名闭包而导致性能损失


有更好的方法吗?

重置
函数应该这样做

(reset! atom-name new-value)
您可以使用(比较并设置atom旧值和新值)


但我觉得奇怪的是,你需要把它们改变成不相关的值。你不能使用绑定或类似的东西。

太棒了。。。正是我要找的!它用于跨线程管理一个共享并发状态单元,从而使绑定无法工作。AFAICS原子似乎是实现这一点的标准方法……没错,但我担心全局变量的语义经常会更改为无法从先前值转换的值。通过绑定,可以创建“共享”状态的快照,直到再次保留捕获范围。如果这是不可接受的,那么线程和通过atom的某种线程间通信之间必须存在有时间限制的依赖关系。我没有遇到过这样的用例,我通常只有配置、聚合或原子中的会话/缓存之类的东西。例如:模拟中的计时器。不同的线程可能需要读取最新的全局时间戳,只有一个线程更新它。更新与以前的值无关。