concurrency - 拆分选择原子内的元素并更新它,而不牺牲安全并发性。

标签 concurrency clojure swap

假设我有一个包含在原子中的数据结构,我首先想选择其中的一个元素,然后更新该元素。我可以在一次交换中完成这两项操作!,这对于竞争条件和其他令人讨厌的事情来说是正确的,但不允许太多并发性。有更好的解决方案吗?

在下面的示例中,代码会变慢很多,因为查找的值会定期修改(每 50 毫秒),因此需要交换!回滚。

(swap! myAtom
    (fn [atom-state]
        (let [lookedUp (searchValIn atom-state)] ;This slows down the code
            (if (*some condition*)
                lookedUp
                (modify lookedUp)))))

换句话说:我希望在不牺牲安全并发性的情况下分开选择元素并更新它。

最佳答案

据我了解,这是不可能的。为了保持数据 View 的一致性,您需要在单个“事务”内进行查找并执行更新(用引号引起来,因为事务术语不适用于原子操作)。

关于concurrency - 拆分选择原子内的元素并更新它,而不牺牲安全并发性。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37003768/

相关文章:

c++ - concurrency::when_all 的返回 vector 的结果是 FIFO 吗?

go - Go 中令人困惑的并发和性能问题

clojure - 如何使用 Leiningen 指定类路径?

java - java中的并发如何提高单核处理器上运行程序的性能?

java - 具有 UserThread 和序列化的线程中的 Hibernate session

java - 其他JVM语言的IntelliJ IDEA插件开发

clojure - 在 Clojure (.clj) 脚本中导入 .jar (vaadin-6.4.8.jar) 文件

c - C Union 中的 Endian 交换

javascript - 交换两个 DIV 元素? (预览一个而另一个占据整个页面) - EDITED : Swapping DIV and IFRAME

backbone.js - 交换/切换/交换backbone.js View 到位吗?