我有一个并行运行几个线程的Clojure代码。它们都共享一个原子:(def counter (atom 0))
,它由每个线程递增。每10分钟后,我想执行使用原子值几个动作,然后重置回0 - 例如:Clojure:阻止使用原子?
(defn publish-val []
(let [c @counter]
(email c)
(statsd c)
(print-log c)
(reset! counter 0)))
说的counter
值将不会从此刻改变是很重要的它被解除引用到它被重置的那一刻 - 这意味着在尝试更改原子值时所有线程都应该被阻塞,而执行publish-val
。我该怎么做呢?
我觉得'(with-local-vars [c nil](重置!计数器(do(var-set c @counter)0))(println @c))'在这里更准确..你有什么理由喜欢'swap!'和'fn [c]'? – shakedzy
@shakedzy - 使用'swap!'保证原子性。如果您使用'reset!',您可能会在读'@ counter'和调用'(reset!counter 0)''之间丢失'counter'的一些更新。 – DaoWen