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?
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).
Tags und Links c++ multithreading language-lawyer memory-model