2010-01-01 17 views
10

So che come dello standard C++ 03, inizializzazioni statiche a scopo funzionale non sono garantiti per essere sicuri filo:C++ 0x inizializzazioni statiche e sicurezza filo

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

Con il C++ 0x Lo standard che fornisce finalmente il supporto thread standard, sono le inizializzazioni statiche in ambito funzionale richieste per essere thread-safe?

+3

Penso che ad oggi si chiamerà C++ 1x –

+0

Bjarne Stoustrup dice di pensare alla x come un numero esadecimale, quindi ancora 0x –

+0

@John: indipendentemente da ciò che lui può pensare o come, la mia comprensione è che Le linee guida ISO richiedono il controllo delle versioni di documenti come gli standard per essere in base-10. –

risposta

9

sembra l'inizializzazione sarebbe thread-safe, poiché nel caso l'oggetto viene dinamicamente inizializzato entrando funzione, è garantito da eseguire in una sezione critica:

§ 6.7 stmt.decl

4.. ... quando un oggetto viene inizializzato il primo controllo di tempo passa attraverso la sua dichiarazione ... Se il controllo immette la dichiarazione contemporaneamente durante l'inizializzazione dell'oggetto, l'esecuzione simultanea deve attendere il completamento dell'inizializzazione ... c'è un potenziale bordo-caso, se dopo il ritorno da main(), il distruttore di un oggetto statico chiama la funzione dopo che il locale statico è già stato distrutto, il comportamento non è definito. tuttavia, dovrebbe essere facile da evitare.

+3

Le ultime parole famose "dovrebbero essere facili da evitare". È tremendamente difficile da evitare nel caso generale. –

+0

@deft_code: +1, è stato recentemente morso da quello. – peterchen