2016-06-06 16 views
8

Czy ta globalna funkcja ma awarię statycznego inicjowania?std :: wątek :: hardware_concurrency i inicjalizacja statyczna

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

Niepowiązana nitpick: zauważ, że twoja zmienna NThread będzie istniała dla każdego odróżnienia Implementacja ct szablonu funkcji. – rubenvb

Odpowiedz

7

Niech ta globalna funkcja cierpią statycznej inicjalizacji fiasko?

Nie, nie będzie. Jesteś bezpieczny ... :-)

Cytowanie C++ standardowy projekt (kopalnia nacisk) ...

$6.7: 4:Dynamiczny inicjalizacji zmiennej bloku z zakresu statycznej czas przechowywania ([podstawowy .stc.static]) lub przechowywanie wątków czas trwania ([basic.stc.thread]) jest wykonywany po raz pierwszy kontrola przechodzi przez swoją deklarację; taką zmienną uważa się za zainicjowaną po zakończeniu jej inicjalizacji. Jeśli inicjalizacja kończy się przez zgłoszenie wyjątku, inicjalizacja nie jest zakończona , więc zostanie wypróbowana ponownie, gdy następna kontrola przejdzie do deklaracji . Jeśli kontrola wchodzi deklarację jednocześnie gdy zmienna jest inicjowana, równoczesne wykonanie musi poczekać na zakończenie inicjalizacji

Zobacz również: Static local variables

Ponieważ funkcja jest szablonem funkcji template <typename TFn> , dla każdego oddzielnego wystąpienia (podstawienie TFn), zostanie ocenione

+1

A od wersji 2015 działa to również w Microsoft Visual Studio ... – rubenvb

+0

Cool. Ale co, jeśli funkcja zostanie utworzona w konstruktorze statycznego obiektu ([link] (https://isocpp.org/wiki/faq/ctors#static-init-order))? – metalfox

+0

@metalfox, na twoje pytanie: nie będzie żadnego problemu! Pamiętaj, że zmienna statyczna ma zasięg * zakresu funkcji *. Jest gwarantowane, że zostanie zainicjowane po raz pierwszy, gdy zostanie wywołane w czasie wykonywania przez ** ktokolwiek **. (Odczytaj cytowany akapit). Twój link dotyczy innego scenariusza, tj. Kiedy obiekty znajdują się w * globalnym zasięgu *: w takim przypadku odpowiedź znajduje się w [następnej sekcji] (https://isocpp.org/wiki/faq/ctors#static-init-order do pierwszego użycia) – WhiZTiM

Powiązane problemy