Clojure中的代理和线程同步

时间:2019-04-08 01:00:30

标签: multithreading join concurrency clojure

我必须使用代理重写该代码,以某种方式x的结果为0(这意味着每个线程一个接一个地执行)。但是我遇到了问题,因为我对代理的使用没有足够的了解。 原始代码是:

(def x 0)
(let [t1 (Thread. #(dotimes [_ 10000] (def x (inc x))))
      t2 (Thread. #(dotimes [_ 10000] (def x (dec x))))]
  (.start t1)
  (.start t2)
  (.join t1)
  (.join t2)
  (println x))

当我想使用带有await(agent_name)的代理程序使每个线程分别运行时,它不起作用,结果总是不同于零。 请对此有何建议?

1 个答案:

答案 0 :(得分:3)

我尝试了一下,并按预期打印了0

(ns agent-demo.core
  (:gen-class))

(def counter
  (agent 0))

(defn -main [& args]
  (let [t1 (Thread. #(dotimes [_ 10000]
                       (send counter inc)))
        t2 (Thread. #(dotimes [_ 10000]
                       (send counter dec)))]
    (.start t1)
    (.start t2)
    (.join t1)
    (.join t2)
    (await counter)
    (println @counter)
    (shutdown-agents)))