Ich gehe durch das Buch 7 concurrency models in 7 weeks
. Darin Philosophen als eine Anzahl von ref
‚s vertreten:Understanding STM Eigenschaften in Clojure
(def philosophers (into [] (repeatedly 5 #(ref :thinking))))
Der Zustand jeden Philosophen zwischen :thinking
und :eating
mit dosync
Transaktionen gewährleisten Konsistenz gekippt wird.
Jetzt mag ich einen Thread haben, die aktuellen Status ausgibt, so dass ich sicher sein kann, dass der Staat zu allen Zeiten gültig ist:
(defn status-thread []
(Thread.
#(while true
(dosync
(println (map (fn [p] @p) philosophers))
(Thread/sleep 100)))))
Wir mehr verwenden @
Werte jeden Philosophen zu lesen. Es kann passieren, dass einige Referenzen geändert werden, wie wir über Philosophen map
. Würde es uns veranlassen, inkonsistenten Zustand zu drucken, obwohl wir keinen haben?
Ich bin mir bewusst, dass Clojure verwendet MVCC
zu implementieren STM
, aber ich bin mir nicht sicher, ob ich es richtig anwenden.
Meine Transaktion enthält Nebenwirkungen und sollte in der Regel nicht innerhalb einer Transaktion angezeigt werden. Aber in diesem Fall wird die Transaktion immer erfolgreich sein und die Nebenwirkung sollte nur einmal stattfinden. Ist das akzeptabel?