我有一個並行運行幾個線程的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