2016-11-25 1 views
3

Wenn ich einen Thread, der "Main" -Thread, eine globale Variable initialisieren und dieser Thread spawns später einige Threads, die auf diese Variable zugreifen, muss ich tun Jede Arbeit, wie ein Aufruf von std :: atomic_thread_fence (memory_order_seq_cst), um sicherzustellen, dass die Variable für die neuen Threads initialisiert erscheint? Ich vermute, dass die Tatsache, dass der Haupt-Thread die neuen Threads erstellt, eine "synchronisierte-mit-Beziehung" schafft, die ausreicht, um irgendwelche Rennen zu verhindern, aber ich bin mir nicht sicher.C++ Speicher Semantik und Globals, die am Anfang eines Programms gesetzt werden

Hier einige Pseudo-Code für das, was ich beschreibe:

class MyApi { 
public: 
    static void init(Foo *foo) { 
     MyApi::foo = foo; 
    } 

    static Foo* getSharedFoo() { 
     return foo; 
    } 

private: 
    static Foo* foo; 
}; 

void main() { 
    Foo* foo = new Foo(); 
    MyApi::init(foo); 
    // Spawn threads that will call MyApi::getSharedFoo() and expect 
    // to receive the same foo that is created above. 
} 

Antwort

2

Nein, Sie müssen nichts Besonderes tun. Neue Threads sehen alle Speicheränderungen bis zu dem Punkt, an dem sie erstellt wurden.

0

30.3.1.2 Gewinde Konstruktoren

[...] Template expliziter Faden (F & & f, Args & & ... args);

[...]

Synchronisation: Die Fertigstellung des Aufrufs des Konstruktors synchronisiert mit dem Beginn des Aufrufs der Kopie von f.

Dies gibt an, dass alles f sieht, die vor dem Aufbau des std::thread Objekt aufgetreten ist, die den Thread erzeugt.

Verwandte Themen