Синхронизация агентов и потоков в Clojure

#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. Спасибо, мой друг, я застрял в этом вопросе. 😀