#multithreading #join #concurrency #clojure
#многопоточность #Присоединиться #параллелизм #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(имя_агента), чтобы заставить каждый поток запускаться отдельно, это не работает, результат всегда отличается от нуля.
Пожалуйста, есть какие-либо предложения по этому поводу?
Ответ №1:
Я попробовал это, и оно печатается 0
как ожидалось:
(ns agent-demo.core
(:gen-class))
(def counter
(agent 0))
(defn -main [amp; 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)))
Комментарии:
1. Спасибо, мой друг, я застрял в этом вопросе. 😀