2010-01-01 24 views
10

wiem, że jako standardu C++ 03, funkcja, zakres statyczne pliki uruchamiania nie są gwarancją wątek bezpieczne:C++ 0x statyczne pliki uruchamiania i bezpieczeństwo wątek

void moo() 
{ 
    static std::string cat("argent"); // not thread safe 
    ... 
} 

z C++ 0x standard ostatecznie udostępnia standardowe wsparcie wątków, czy inicjalizacje statyczne zakresu funkcji muszą być bezpieczne dla wątków?

+3

Myślę, że od dzisiaj będzie się nazywać C++ 1x –

+0

Bjarne Stoustrup mówi o x jako liczbie szesnastkowej, więc nadal 0x –

+0

@John: Niezależnie od tego, co może myśleć lub jak, moje zrozumienie jest takie Wytyczne ISO wymagają wersjonowania dokumentów, takich jak normy, w bazie-10. –

Odpowiedz

9

wydaje inicjalizacji byłyby wątku bezpieczne, ponieważ w przypadku, gdy obiekt jest dynamicznie zainicjowany po wejściu do funkcji, to zagwarantowane mają być wykonane w krytycznym punkcie:

§ 6.7 stmt.decl

4.. ... taki obiekt jest inicjowany po pierwszym przejściu kontroli przez swoją deklarację ... Jeśli formant wejdzie w deklarację jednocześnie podczas inicjowania obiektu, to wykonanie współbieżne powinno czekać na zakończenie inicjowania ...

Istnieje potencjalny przypadek krawędzi, jeśli po powrocie z głównej() destruktor statycznego obiektu wywołuje funkcję po tym, jak statyczne lokalne już zniszczyło, zachowanie jest niezdefiniowane. jednak powinno to być łatwe do uniknięcia.

+3

Znane ostatnie słowa "powinny być łatwe do uniknięcia". W ogólnym przypadku jest to niezwykle trudne do uniknięcia. –

+0

@deft_code: +1, został ostatnio przez to ugryziony. – peterchen