2012-08-22 7 views
9

Duplicar posible:
C++11 thread_local in gcc - alternatives
Is there any way to fully emulate thread_local using GCC's __thread?Cómo inicializar la variable local de subprocesos en C++?

que quería usar el C++ 11 thread_local para crear y utilizar variables thread_local pero como todavía no está soportado por gcc, me Estoy usando gcc específico __thread. La forma en que ha declarado la variable es

myClass 
{ 
public: 

    static __thread int64_t m_minInt; 

}; 
__thread int64_t myClass::m_minInt = 100; 

Cuando compilo, me sale un error como

error: ‘myClass::minInt’ is thread-local and so cannot be dynamically initialized 

Cómo hacer correctamente?

PS: gcc versión: 4.6.3

+6

@betabandido la pregunta que ha vinculado discute la alternativa a thread_local en C++ 11. Mi pregunta es cómo usar __thread de gcc. Específicamente el mensaje de error en cuestión. Traté de encontrarlo en otro lugar, pero no pude conseguirlo. Gracias. – polapts

Respuesta

5

Es necesario utilizar la inicialización perezosa.

myClass 
{ 
public: 

    static __thread int64_t m_minInt; 
    static __thread bool m_minIntInitialized; 

    static int64_t getMinInt(); 
}; 
__thread int64_t myClass::m_minInt; 
__thread bool myClass::m_minIntInitialized; 


int64_t myClass::getMinInt() 
{ 
    if (!m_minIntInitialized) // note - this is (due to __thread) threadsafe 
    { 
    m_minIntInitialized = true; 
    m_minInt = 100; 
    } 

    return m_minInt; 
} 

m_minIntInitialized se garantiza que es cero.

En la mayoría de los casos (ELF specification) se coloca en la sección .tbss, que se inicia con cero.

Para C++ - http://en.cppreference.com/w/cpp/language/initialization

Para todas las demás variables estáticas y de subproceso local no locales, Zero inicialización tiene lugar. En la práctica, las variables que van a con inicialización cero se colocan en el segmento .bss de la imagen del programa , que no ocupa espacio en el disco, y se pone a cero por el OS al cargar el programa.

+7

¿Cómo se sabe que m_minIntInitialized es inicialmente falso? – CygnusX1

+2

@ CygnusX1, he actualizado la respuesta. – nothrow

+0

Tiene una condición de carrera: otro hilo puede leer m_minInt después de que el indicador se establece en verdadero pero antes de que la variable se inicialice; – gdy

Cuestiones relacionadas