Ich möchte ungefähr Folgendes tun:
Anfänglicher Thread:
- Schreiben Sie einige Werte in globale Variablen (sie werden nie wieder geschrieben).
- Dies können mäßig große Daten sein (Arrays, Strings usw.). Kann nicht einfach gemacht werden
std::atomic<>
.
- Dies können mäßig große Daten sein (Arrays, Strings usw.). Kann nicht einfach gemacht werden
- andere Threads erzeugen
Andere Themen:
- Lesen Sie den globalen Zustand
- Arbeit machen, etc.
Jetzt weiß ich, dass ich Argumente übergeben kann std::thread
, aber ich versuche anhand dieses Beispiels die Speichergarantien von C ++ zu verstehen.
Außerdem bin ich ziemlich sicher, dass das Erstellen eines Threads bei jeder realen Implementierung eine Speicherbarriere verursacht, die sicherstellt, dass der Thread alles "sehen" kann, was der übergeordnete Thread bis zu diesem Zeitpunkt geschrieben hat.
Aber meine Frage ist: Ist dies durch den Standard garantiert?
Nebenbei: Ich nehme an, ich könnte einen Dummy std::atomic<int>
oder so hinzufügen und darauf schreiben, bevor ich die anderen Threads starte, und dann auf den anderen Threads, lesen Sie das einmal beim Start. Ich glaube, alle Maschinen, die vorher passieren, würden dann garantieren, dass der zuvor geschriebene globale Zustand richtig sichtbar ist.
Aber meine Frage ist, ob so etwas technisch erforderlich ist oder ob die Thread-Erstellung ausreicht.
quelle
std::atomic<int>
... Sie können verwendenstd::atomic_thread_fence
.Antworten:
Thread-Erstellung ist genug. Es gibt einen Synchronisationspunkt zwischen dem Thread-Konstruktor und dem Start des neuen Threads gemäß [thread.thread.constr] / 7
Dies bedeutet, dass alle Zustände im Thread, bevor der neue Thread erzeugt wird, für den erzeugten Thread sichtbar sind.
quelle