2009-08-13 10 views
56

En el código de ejemplo¿Las variables estáticas de la función son seguras para subprocesos en GCC?

void foo() 
{ 
    static Bar b; 
    ... 
} 

compilado con GCC es que garantiza que b se crea e inicializa de manera thread-safe?

En página del manual de gcc, encontró el -fno-multi-hilo-estática opción de línea de comandos:

No emite el código extra para usar las rutinas especificados en el ABI de C++ para multi-hilo inicialización de la estática local . Puede usar esta opción para reducir el tamaño del código ligeramente en el código que no necesita ser seguro para subprocesos.

  1. ¿Quiere decir, que son estáticos locales flujos seguros por defecto con GCC? Entonces no hay razón para poner protección explícita, p. con pthread_mutex_lock/unlock?

  2. Cómo escribir código portable: cómo comprobar si el compilador agregará sus protecciones? ¿O es mejor desactivar esta característica de GCC?

Respuesta

41
  1. No, esto significa que la inicialización de locales static s es thread-safe.

  2. Definitivamente desea dejar esta función habilitada. La inicialización segura de roscas de static s local es muy importante. Si necesita generalmente acceso seguro a subprocesos a los static s locales, necesitará agregar los protectores apropiados usted mismo.

+1

¿para qué sirve la inicialización segura de subprocesos si no tiene acceso seguro a subprocesos (función local)? – xtofl

+10

Para inicializar el mutex que usará para controlar el acceso a otras variables. – AProgrammer

+6

Si tiene que escribir un código portátil, no puede confiar en la inicialización segura de la función de estática de la función. Por ejemplo, MS C++ no lo hace. Por lo tanto, no estoy de acuerdo con el punto 2: puede deshabilitarlo de manera segura, si desea escribir código portátil, pero no debe usar la función estática donde la seguridad de la secuencia es importante ;-) – hirschhornsalz

5

creo que la frase clave es

... de estáticos locales compatibles con el proceso de inicialización .

He leído esto como que solo se trata de una inicialización de estática que 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.

6

Esto realmente no responde a sus preguntas de inmediato (Charles already did that), pero creo que es hora de publicar un enlace a this article nuevamente. Arroja luz sobre la inicialización de variables globales y debe ser leído y entendido por todos intentar utilizar static variables en un entorno multi-hilo.

17

Tuvimos serios problemas con el código de bloqueo generada por GCC 3.4 para proteger la inicialización estática local. Esa versión utiliza un mutex compartida mundial para proteger a todos y cualquier inicialización estática que conducen a un callejón sin salida en nuestro código. Tuvimos una variable estática local inicializado a partir de un resultado de una función, que comenzó otro hilo, que creó 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 era 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 utiliza un solo mutex global para este propósito al escribir una aplicación de muestra. (La dificultad de la seguridad de hilos es evidente por el hecho de que incluso gcc no puede hacerlo bien)

+1

Me he enfrentado a una situación muy similar, y me hizo plantear esta pregunta aquí en SO – CsTamas

+1

'static SomeClass s();' es una declaración de función –

Cuestiones relacionadas