„Clojure-Programmierung“ (Emerick, O'Reilly) heißt es, dass:Deref innerhalb einer Transaktion kann einen Wiederholungsversuch auslösen - welche Rolle spielt der ref-Statusverlauf?
(...), wenn ein neuer Wert, wenn seit dem Beginn von einer anderen Transaktion verpflichtet der aktuellen Transaktion, um den neuen Wert des ref ab dem Beginn der Transaktion kann nicht zur Verfügung gestellt werden. Hilfreicherweise bemerkt das STM dieses Problem und behält eine begrenzte Historie der Zustände von refs bei, die an einer Transaktion beteiligt sind, wobei die Größe des Verlaufs bei jedem erneuten Versuch erhöht wird. Dies erhöht die Wahrscheinlichkeit, dass die Transaktion an einem bestimmten Punkt nicht mehr wiederholt werden muss, da, während der Ref korrekt aktualisiert wird, der gewünschte Wert immer noch in der Historie vorhanden ist.
Als nächstes geben sie einige Code-Beispiele zur Veranschaulichung des Problems.
Erstens, dass das Lesen Transaktion zu erläutern wird nur gelingen, wenn alle Schriftsteller Transaktionen durchgeführt werden (also a = 500
):
(def a (ref 0))
(future (dotimes [_ 500] (dosync (Thread/sleep 20) (alter a inc))))
@(future (dosync (Thread/sleep 1000) @a))
; 500
(ref-history-count a)
; 10
Und zweitens, um darzustellen, dass :min-history
und :max-history
Einstellung mit Lesern Transaktion Wiederholungen helfen kann (dies Zeit a
hat früher erfolgreich gelesen wurde - Wert von 33):
(def a (ref 0 :min-history 50 :max-history :100))
(future (dotimes [_ 500] (dosync (Thread/sleep 20) (alter a inc))))
@(future (dosync (Thread/sleep 1000) @a))
; 33
ich, warum deref
innerhalb der Leser Transaktion verstehen bewirkt, dass es erneut versucht wird (wenn einige Writer-Transaktionen Änderungen an ref vornehmen). Was ich nicht verstehe, ist dieser Teil: "Dies erhöht die Chance, dass die Transaktion irgendwann nicht mehr wiederholt werden muss, da der Ref-Wert zwar konstant aktualisiert wird, der gewünschte Wert aber immer noch in der Historie vorhanden ist".
Was ist der "gewünschte Wert"? Wie ändert sich die Referenzgeschichte im Laufe der Zeit in den obigen Beispielen? Kann mich jemand auf eine Erklärung oder ein Beispiel mit einer Zeitleiste verweisen, die zeigt, wie die ref-Geschichte funktioniert?
Sie haben es ziemlich genagelt :) Perfekte Antwort, danke! – kamituel