Implizite Synchronisation beim Erstellen / Verknüpfen von Threads

8

Was ist der minimale Rahmen, der für den Code von x benötigt wird, damit dieser Code funktioniert, unter Berücksichtigung der implizierten Synchronisation beim Erstellen / Verbinden eines Threads: std::atomic ? %Code%? nichts?

%Vor%     
vpozdyayev 16.04.2015, 19:34
quelle

1 Antwort

11

Der Aufruf des Konstruktors von std::thread wird synchronisiert und findet vor dem Aufruf der Kopie der Thread-Funktion (30.3.1.2/6) statt.

thread::join gibt eine ähnliche Synchronisationsgarantie: Die Fertigstellung des Threads erfolgt, bevor join zurückkehrt (30.3.1.4/7).

Ihr Code erstellt einen Thread und verbindet ihn sofort. Obwohl Ihr Lambda per Referenz erfasst, gibt es keine Parallelität (der Code läuft als wenn sequenziell), und die von std::thread bereitgestellten Garantien stellen sicher, dass Sie kein spezielles Framing benötigen, um x zu schützen. Die Behauptung wird niemals fehlschlagen.

Angenommen, Ihr Code-Snippet wäre anders, so dass Sie tatsächlich gleichzeitigen Zugriff haben, müssten Sie std::atomic oder einen Mutex verwenden. volatile wäre definitiv nicht genug (außer zufällig).

    
Damon 16.04.2015, 20:26
quelle