Sind TChan-Schreiben in Haskell STM integriert?

8

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?

%Vor%

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.

    
Dax Fohl 05.06.2013, 07:12
quelle

1 Antwort

11

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.

    
valderman 05.06.2013, 08:43
quelle

Tags und Links