假设我有一个包含在原子中的数据结构,我首先想选择其中的一个元素,然后更新该元素。我可以在一次交换中完成这两项操作!,这对于竞争条件和其他令人讨厌的事情来说是正确的,但不允许太多并发性。有更好的解决方案吗?
在下面的示例中,代码会变慢很多,因为查找的值会定期修改(每 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/