Kompositionsbeispiel für Software-Transaktionsspeicher

11

Einer der Hauptvorteile des Software-Transaktionsspeichers, der immer erwähnt wird, ist die Kompositionsfähigkeit und Modularität. Verschiedene Fragmente können kombiniert werden, um größere Komponenten herzustellen. In sperrbasierten Programmen ist dies häufig nicht der Fall.

Ich suche ein einfaches Beispiel, das dies mit tatsächlichem Code veranschaulicht. Ich würde ein Beispiel in Clojure bevorzugen, aber Haskell geht es auch gut. Bonuspunkte, wenn das Beispiel auch einen sperrbasierten Code enthält, der nicht einfach zusammengesetzt werden kann.

dbyrne
quelle
1
Interessant, klingt aber für mich eher nach einer StackOverflow-Frage.
Steve
Diese Frage wurde dort 4 Minuten später gestellt. stackoverflow.com/questions/5518546/… Würde jemand diese Frage migrieren und zusammenführen (wenn möglich)?
Job
Ja, nachdem ich es hier gepostet hatte, wurde mir klar, dass es bei Stackoverflow wahrscheinlich besser sein würde. Wenn jemand es zusammenführen kann, ist das gut für mich.
Dbyrne

Antworten:

9

Angenommen, Sie haben einige Bankkonten:

(def accounts 
 [(ref 0) 
  (ref 10) 
  (ref 20) 
  (ref 30)])

Und eine atomare "Transfer" -Funktion:

(defn transfer [src-account dest-account amount]
  (dosync
    (alter dest-account + amount)
    (alter src-account - amount)))

Welches funktioniert wie folgt:

(transfer (accounts 1) (accounts 0) 5)

(map deref accounts)
=> (5 5 20 30)

Sie können dann die Übertragungsfunktion einfach zusammenstellen, um eine Transaktion auf höherer Ebene zu erstellen, z. B. die Übertragung von mehreren Konten:

(defn transfer-from-all [src-accounts dest-account amount]
  (dosync
    (doseq [src src-accounts] 
      (transfer src dest-account amount))))

(transfer-from-all 
  [(accounts 0) (accounts 1) (accounts 2)] 
  (accounts 3) 
  5)

(map deref accounts)
=> (0 0 15 45)

Beachten Sie, dass alle Mehrfachübertragungen in einer einzigen kombinierten Transaktion stattfanden, dh es war möglich, die kleineren Transaktionen zu "komponieren".

Dies mit Sperren zu tun, würde sehr schnell kompliziert werden: Wenn die Konten einzeln gesperrt werden müssten, müssten Sie beispielsweise ein Protokoll für die Reihenfolge der Sperrenerfassung erstellen, um Deadlocks zu vermeiden. Es ist sehr leicht, einen schwer zu erkennenden Fehler zu machen. STM bewahrt Sie vor all diesen Schmerzen.

mikera
quelle