braunbär hat geschrieben:Der assembler hat nichts zu sagen, critical sections sind per definition atomar, während boolean Felder auf Compiler und Architektur ankommen.
Mit der neuen Fpc version könnte das schon ganz anders aussehen. Bei nicht definiertem verhalten darf man niemals Annahmen über das Verhalten machen.
Zum einen würde mich ein Link dazu interessieren.
Zum anderen wäre das in diesem Fall auch egal, weil auf der einen Seite nur gelesen, und auf der anderen nur geschrieben wird.
Entweder das Schreiben passiert "rechtzeitig", dann wird der Click in der aktuellen Schleife verarbeitet, oder es kommt zu spät, dann eben in der nächsten Schleife. Passieren kann nichts. Nebenbei würde ich die Wahrscheinlichkeit, dass in einer zukünftigen FPC Version das atomare movb bzw. cmpb durch irgend etwas anderes ersetzt wird, auf eine glatte Null einschätzen.
Delphi produziert hier übrigens auch ganz atomaren Code. Zumindest Delphi 5 und das RAD Studio 10.1 Berlin. Turbo Pascal 3 ebenfalls.
Die Versionen dazwischen habe ich nicht gecheckt.PS: critical sections machen übrigens ein Check und set in einer Aktion, also ein der Wert wird ausgelesen, ein neuer wert wird geschrieben, in einem Tick. Ohne diese atomare Eigenschaft kann zwischen dem get und dem set unterbrochen werden, und dann denken beide Threads die Variable wäre nicht gesetzt und führen gleichzeitig Code aus. Mit critical sections ist das per Definition unmöglich, unabhängig von compilerverhalten, Optimierung oder Architektur
Das ist schon klar, hat aber mit der Aufgabenstellung hier nichts zu tun.
Tut mir leid, ich hatte gestern wohl ein paar Bierchen zu viel, und habe irgendwie deinen ersten Post mit dem von wp zusammen gelesen, und dachte du wölltest das über islocked lösen, dass ist nämlich alles andere als atomar.
Deine Lösung funktioniert so, allerhöchstens könnte es dazu führen das mit der Aktion ein kompletter Zyklus länger gewartet werden muss, aber ansonsten ist sie gut