Como inicializar a variável local do encadeamento em c ++? [duplicado]

9

Eu queria usar o c ++ 11 thread_local para criar e usar a variável thread_local, mas como ainda não é suportado pelo gcc, estou usando o __thread específico do gcc. A maneira que eu declarei a variável é

myClass
{
public:

  static __thread int64_t m_minInt;

};
__thread int64_t myClass::m_minInt = 100;

Quando eu compilo, recebo um erro como

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

Como fazer isso corretamente?

PS: versão do gcc: 4.6.3

    
por polapts 22.08.2012 в 16:27
fonte

1 resposta

5

Você precisa usar a inicialização lenta.

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 é garantido como zero.

Na maioria dos casos ( especificação ELF ), ele é colocado na seção .tbss, que é inicializada com zero.

Para C ++ - link

  

Para todas as outras variáveis não-locais estáticas e locais de thread, Zero   inicialização ocorre. Na prática, as variáveis que vão   ser zero-inicializado são colocados no segmento .bss do programa   imagem, que não ocupa espaço no disco, e é zerada pelo SO   ao carregar o programa.

    
por nothrow 22.08.2012 / 16:35
fonte