Bietet das Laichen eines Threads selbst Garantien für die Speicherreihenfolge?

20

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<>.
  • 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.

jwd
quelle
Ich nehme an, ich könnte einen Dummy hinzufügen std::atomic<int>... Sie können verwenden std::atomic_thread_fence.
Rin Kaenbyou
@ NathanOliver d'oh. Kommentar entfernt. Ich kann nicht zählen, wie oft du mir hier geholfen hast, egal wie dumm meine Fragen sind ...
idclev 463035818
1
@ idclev463035818 Keine Sorge. Es passiert uns allen.
NathanOliver

Antworten:

26

Thread-Erstellung ist genug. Es gibt einen Synchronisationspunkt zwischen dem Thread-Konstruktor und dem Start des neuen Threads gemäß [thread.thread.constr] / 7

Synchronisation: Der Abschluss des Aufrufs des Konstruktors wird mit dem Beginn des Aufrufs der Kopie von synchronisiert f.

Dies bedeutet, dass alle Zustände im Thread, bevor der neue Thread erzeugt wird, für den erzeugten Thread sichtbar sind.

NathanOliver
quelle