c++ - method - ¿Las variables estáticas de la función son seguras para subprocesos en GCC?
variables static c# (4)
No, significa que la inicialización de
static
locales es segura para subprocesos.Definitivamente desea dejar esta característica habilitada. La inicialización segura de las
static
locales es muy importante. Si necesita generalmente acceso a subprocesos astatic
locales, necesitará agregar las protecciones apropiadas usted mismo.
En el código de ejemplo
void foo()
{
static Bar b;
...
}
compilado con GCC, ¿ está garantizado que b
se creará e inicializará de manera segura para subprocesos?
En la página man de gcc, se encuentra la opción de línea de comando -fno-threadsafe-static :
No emita el código adicional para usar las rutinas especificadas en C ++ ABI para la inicialización segura de subprocesos de estática local. Puede usar esta opción para reducir el tamaño del código ligeramente en código que no necesita ser seguro para subprocesos.
¿Significa que la estática local es segura para subprocesos por defecto con GCC? Entonces, ¿por qué no hay razones para poner protección explícita, por ejemplo, con
pthread_mutex_lock/unlock
?Cómo escribir código portable: ¿cómo verificar si el compilador agregará sus protecciones? ¿O es mejor desactivar esta característica de GCC?
Creo que la frase clave es
... inicialización segura de subprocesos de estática local.
Leí esto como que significa que solo la inicialización de la estática se haría de una manera segura para la ejecución de subprocesos. El uso general de la estática no sería seguro para subprocesos.
En realidad, esto no responde sus preguntas de inmediato ( Charles ya lo hizo ), pero creo que es hora de publicar nuevamente un enlace a este artículo . Arroja luz sobre la inicialización de los globales y debe ser leído y entendido por todos los que intenten usar variables static
en un entorno multihilo.
Tuvimos problemas serios con el código de bloqueo generado por GCC 3.4 para proteger la inicialización estática local. Esa versión usaba un mutex compartido global para proteger todo y cualquier inicialización estática que condujera a un punto muerto en nuestro código. Teníamos una variable estática local inicializada a partir del resultado de una función, que iniciaba otro hilo, que creaba una variable estática local. Pseudocódigo:
voif f()
{
static int someValue = complexFunction();
...
}
int complexFunction()
{
start_thread( threadFunc() );
wait_for_some_input_from_new_thread();
return input_from_new_thread;
}
void threadFunc()
{
static SomeClass s();
...
}
La única solución fue desactivar esta función de gcc. Si necesita que su código sea portátil, cosa que hicimos, de todos modos no puede depender de una función agregada en una versión específica de gcc para seguridad de hilos. Supuestamente, C ++ 0x agrega estática local segura para subprocesos, hasta entonces esta es una magia no estándar que hace que su código no sea portátil, por lo que le aconsejo que no lo haga. Si decide usarlo, le sugiero que valide que su versión de gcc no usa un solo mutex global para este propósito al escribir una aplicación de muestra. (La dificultad de la seguridad de la hebra es evidente por el hecho de que incluso gcc no puede hacerlo bien)