Muss ich sperren oder als flüchtig markieren, wenn ich in C # auf ein einfaches Boolesches Flag zugreife?

Sagen wir einfach, Sie haben eine einfache Operation, die auf einem Hintergrundthread ausgeführt wird. Sie möchten eine Möglichkeit zum Abbrechen dieses Vorgangs bereitstellen, damit Sie ein Boolesches Flag erstellen, das Sie im Click-Event-Handler einer Abbrechen-Schaltfläche auf true setzen.

private bool _cancelled;

private void CancelButton_Click(Object sender ClickEventArgs e)
{
    _cancelled = true;
}

Jetzt setzen Sie das Cancel-Flag im GUI-Thread, aber Sie lesen es im Hintergrund-Thread. Müssen Sie sperren, bevor Sie auf den Bool zugreifen können?

Müssen Sie dies tun (und natürlich auch die Ereignisbehandlungsroutine für Schaltflächenklicks sperren):

while(operationNotComplete)
{
    // Do complex operation

    lock(_lockObject)
    {
        if(_cancelled)
        {
            break;
        }
    }
}

Oder ist es akzeptabel, dies zu tun (ohne Sperre):

while(!_cancelled & operationNotComplete)
{
    // Do complex operation
}

Oder wie wäre es, wenn Sie die Variable _cancelled als flüchtig markieren. Ist das nötig

[Ich weiß, dass es die BackgroundWorker-Klasse mit der eingebauten CancelAsync () -Methode gibt, aber ich bin an der Semantik und der Verwendung von Sperren und dem Zugriff auf Thread-Variablen interessiert, nicht an der spezifischen Implementierung. Der Code ist nur ein Beispiel.]

Es scheint zwei Theorien zu geben.

1) Da es sich um einen einfachen eingebauten Typ handelt (und der Zugriff auf eingebaute Typen in .net atomar ist) und wir nur an einer Stelle darauf schreiben und nur im Hintergrund-Thread lesen, ist es nicht erforderlich, ihn zu sperren oder als flüchtig zu markieren.
2) Sie sollten es als flüchtig markieren, da der Compiler den Lesevorgang in der while-Schleife optimieren könnte, da er nichts für möglich hält, um den Wert zu ändern.

Welches ist die richtige Technik? (Und warum?)

[Bearbeiten: Es scheint zwei klar definierte und gegensätzliche Denkschulen zu geben. Ich bin auf der Suche nach einer endgültigen Antwort auf diese Frage. Bitte geben Sie nach Möglichkeit Ihre Gründe an und nennen Sie Ihre Quellen zusammen mit Ihrer Antwort.]

Antworten auf die Frage(5)

Ihre Antwort auf die Frage