Wenn eine STM-Transaktion fehlschlägt und erneut versucht wird, wird der Aufruf von writeTChan
erneut ausgeführt, sodass Sie zwei Schreibvorgänge ausführen, oder führt der STM den Schreibvorgang nur durch, wenn die Transaktion festgeschrieben wird? Ist diese Lösung für das Problem des schlafenden Barbiers gültig oder könnte ein Kunde zwei Abschläge erhalten, wenn die Transaktion in enterShop
beim ersten Mal fehlschlägt?
UPDATE
Mir ist erst aufgefallen, dass das obige hairRequestChan
sowieso nicht Teil der Transaktion sein muss. Ich kann eine normale Chan
verwenden und die writeChan
in einer if
Anweisung nach dem atomically
Block in enterShop
. Aber diese Verbesserung zu zerstören, zerstört den ganzen Grund, die Frage zu stellen, also werde ich es hier belassen.
TChan
-Operationen werden ausgeführt, wenn eine Transaktion festgeschrieben wird, genau wie andere STM-Operationen, so dass Sie immer mit einem einzigen Schreibvorgang enden, unabhängig davon, wie oft Ihre Transaktion wiederholt wird. Sie wären sonst irgendwie nutzlos.
Um sich zu überzeugen, versuchen Sie dieses Beispiel:
%Vor% Dies wird eine Ausnahme auslösen, die sich darüber beschwert, dass die Transaktion auf unbestimmte Zeit blockiert ist. Wenn writeTChan
einen Schreibvorgang ausgelöst hat, bevor die Transaktion festgeschrieben wurde, würde das Programm "hi!" bevor diese Ausnahme ausgelöst wird.