Ich überlege, mit einem TVar einen Zustand in einer Webanwendung zu speichern (die beim Neustart neu erstellt werden kann). Die Wettbewerbsaspekte von TVar betreffen mich jedoch. Es scheint, dass eine häufige kurzlaufende Transaktion längere Transaktionen aushungern kann, indem sie sie kontinuierlich unterbricht. Da länger laufende Transaktionen immer wieder neu gestartet werden, würde dies die Belastung der CPU erhöhen und dazu neigen, die Länge dieser Transaktionen weiter zu erhöhen. Irgendwann könnte dies dazu führen, dass der Server nicht mehr reagiert.Haskell: TVar: Verhindern des Hungers
diese Anbetracht, ich habe folgende Fragen:
(1) Kann TVar (oder einen anderen Datentyp) verwenden Schlösser, nicht gleichzeitig Versuche/Wiederholungen.
(2) Kann TVar (oder ein anderer Datentyp) einen anderen Contention-Mechanismus haben, zB "Lassen Sie Transaktionen eine Sekunde laufen, bevor Sie eine andere Transaktion ausführen", oder zumindest einige Garantien, dass Transaktionen schließlich abgeschlossen werden das verhindert starvation für länger laufende Transaktionen).
Hinweis 'retry' startet die Transaktion nicht sofort neu; Transaktionen werden nur wiederholt, wenn die von ihnen verwendeten TVar's geändert werden. – ehird
@ehird: Versuchen Transaktionen nicht automatisch sofort, wenn eine andere Transaktion in die TVar schreibt, die sie zuvor gelesen haben (auch ohne einen Aufruf von 'retry')? – Clinton
@Clinton: Ja, sie versuchen es erneut, aber erst, nachdem das Laufzeitsystem eine Möglichkeit für ein anderes Ergebnis der Transaktion entdeckt hat. I.e. es wartet bis einer der TVars gelesen hat bevor sich der Retry geändert hat. Das macht beschäftigt Warten auf ein Push-Benachrichtigungsschema. – jmg