2010-01-01 13 views
10

sé que a partir del estándar de C++ 03, inicializaciones estáticas función de alcance no están garantizados para estar seguro de rosca:C++ 0x inicializaciones estáticas y seguridad de los subprocesos

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

Con la C++ 0x estándar que finalmente proporciona soporte de subprocesos estándar, ¿son necesarias las inicializaciones estáticas de ámbito de función para ser seguro para subprocesos?

+3

Creo que a partir de hoy se llamará C++ 1x –

+0

Bjarne Stoustrup dice que piense en la x como un número hexadecimal, por lo que 0x –

+0

@John: Independientemente de lo que él pueda pensar o gustar, entiendo que Las directrices ISO requieren que las versiones de los documentos, como los estándares, estén en la base 10. –

Respuesta

9

parece la inicialización sería hilo de seguridad, ya que en el caso de que el objeto se inicializa de forma dinámica al entrar en la función, está garantizado para ser ejecutado en una sección crítica:

§ 6.7 stmt.decl

4.. ... tal objeto se inicializa la primera vez que el control pasa por su declaración ... Si el control ingresa la declaración al mismo tiempo mientras el objeto se está inicializando, la ejecución simultánea esperará a que finalice la inicialización ...

existe un posible caso de borde, si después de regresar de main(), el destructor de un objeto estático llama a la función después de que el local estático ya haya destruido, el comportamiento no está definido. sin embargo, eso debería ser fácil de evitar.

+3

Las últimas palabras famosas "deberían ser fáciles de evitar". Es tremendamente difícil de evitar en el caso general. –

+0

@deft_code: +1, fue mordido recientemente por eso. – peterchen

Cuestiones relacionadas