2016-06-06 11 views
8

Kann diese globale Funktion von statischer Initialisierung Fiasko leiden?std :: thread :: hardware_concurrency und statische Initialisierung

template <typename TFn> 
void ParallelFor(int iIni,int iFin,TFn Fn)  
{ 
    static const unsigned int NThread= std::thread::hardware_concurrency(); 
    // ...  
} 
+5

Unverwandter Nitpick: Beachten Sie, dass Ihre NThread-Variable für jede Unterteilung existiert Instanziierung der Funktionsvorlage. – rubenvb

Antwort

7

diese globale Funktion Kann aus statischer Initialisierung Fiasko leiden?

Nein, würde es nicht. Sie sind sicher ... :-)

der C++ Standardentwurf (Hervorhebung von mir) Zitiert ...

$6.7: 4:Dynamische Initialisierung eines Block-scope Variable mit statischen Lagerdauer ([Grund .stc.static]) oder Threadspeicher Dauer ([basic.stc.thread]) wird beim ersten Mal durchgeführt geht durch seine Deklaration; Eine solche Variable wird als betrachtet, die nach Abschluss ihrer Initialisierung initialisiert wird. Wenn die Initialisierung durch Auslösen einer Ausnahme beendet wird, ist die Initialisierung nicht abgeschlossen, daher wird es beim nächsten Mal erneut versucht, wenn die Steuerung die Deklaration eingibt. Wenn die Steuerung die Deklaration gleichzeitig eintritt, während die Variable initialisiert wird, die gleichzeitige Ausführung wird für den Abschluss der Initialisierung warten

Auch sehen: Static local variables

Da Ihre Funktion eine Funktion Vorlage ist template <typename TFn> Für jede separate Instantiierung (Substitution TFn) wird static const unsigned int NThread = std::thread::hardware_concurrency(); ausgewertet

+1

Und seit Version 2015 funktioniert dies auch auf Microsoft Visual Studio ... – rubenvb

+0

Cool. Was aber, wenn die Funktion im Konstruktor eines statischen Objekts ([link] (https://isocpp.org/wiki/faq/ctors#static-init-order)) instanziiert wird? – metalfox

+0

@metalfox, zu Ihrer Frage: Es würde immer noch kein Problem geben! Denken Sie daran, dass Ihre statische Variable sich in einem * Funktionsblockbereich * befindet. Es wird garantiert initialisiert, wenn es zur Laufzeit von ** whosoever ** aufgerufen wird. (Lies den zitierten Absatz erneut). Ihr Link behandelt ein anderes Szenario, dh wenn sich die Objekte im * globalen Bereich * befinden: In diesem Fall lautet Ihre Antwort im [nächsten Abschnitt] (https://isocpp.org/wiki/faq/ctors#static-init-order) -on-first-use) – WhiZTiM

Verwandte Themen