Wird flüchtiges Bool für die Thread-Kontrolle als falsch angesehen?

Als Ergebnis meiner Antwort auf diese Frageich begann zu Lesen über das Schlüsselwort volatile und was den Konsens betrifft. Ich sehe, es gibt eine Menge von Informationen über Sie, einige alt, das scheint jetzt falsch und viel neues, das sagt, es hat fast keinen Platz in der multi-threaded Programmierung. Daher möchte ich zur Klärung einer bestimmten Nutzung (konnte Sie nicht finden, eine genaue Antwort hier SO).

Ich möchte auch darauf hinweisen, verstehe ich die Anforderungen für das schreiben von multi-threaded code im Allgemeinen und warum volatile ist nicht die Lösung der Dinge. Trotzdem sehe ich code mit volatile für thread-Steuerelement im code-Basen in dem ich arbeite. Weiter, dies ist der einzige Fall, ich benutze die volatile Schlüsselwort als alle anderen freigegebenen Ressourcen werden richtig synchronisiert.

Sagen, dass wir eine Klasse haben wie:

class SomeWorker
{
public:
    SomeWorker() : isRunning_(false) {}
    void start() { isRunning_ = true; /* spawns thread and calls run */ }
    void stop() { isRunning_ = false; }

private:
    void run()
    {
        while (isRunning_)
        {
            //do something
        }
    }
    volatile bool isRunning_;
};

Für Einfachheit sind einige Dinge ausgelassen, aber das wichtigste ist, dass ein Objekt erstellt wird, das etwas tut, in eine neu erzeugte thread-Prüfung ein (volatile) boolean wissen wenn man aufhören sollte. Dieser Boolesche Wert gesetzt ist, aus einem anderen thread, Wann immer es will, dass die Arbeiter zu stoppen.

Mein Verständnis war, dass der Grund für die Verwendung volatile in diesem speziellen Fall ist einfach zu vermeiden-Optimierung, cache würde es in ein register für die Schleife. Also, was in einer unendlichen Schleife. Es gibt keine Notwendigkeit, um richtig zu synchronisieren die Dinge, weil der worker-thread wird irgendwann der neue Wert?

Ich würde gerne verstehen, ob dies als völlig falsch und wenn der richtige Ansatz ist die Verwendung eines synchronisierten Variablen? Gibt es einen Unterschied zwischen compiler/Architektur/Kerne? Vielleicht ist es nur eine schlampige Ansatz lohnt sich vermeiden?

Ich würde mich freuen, wenn jemand würde dies klären. Danke!

BEARBEITEN

Ich wäre daran interessiert zu sehen (im-code), wie Sie sich entscheiden, diese zu lösen.

InformationsquelleAutor der Frage murrekatt | 2011-08-09

Schreibe einen Kommentar