如何在c ++中初始化线程局部变量?

时间:2012-08-22 14:27:52

标签: c++ multithreading gcc thread-local thread-local-storage

  

可能重复:
  C++11 thread_local in gcc - alternatives
  Is there any way to fully emulate thread_local using GCC's __thread?

我想使用c ++ 11 thread_local来创建和使用thread_local变量,但由于gcc尚不支持,我使用的是gcc特定的__thread。我声明变量的方式是

myClass
{
public:

  static __thread int64_t m_minInt;

};
__thread int64_t myClass::m_minInt = 100;

当我编译它时,我收到类似

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

如何正确地做到这一点?

PS:gcc版本:4.6.3

1 个答案:

答案 0 :(得分:6)

您需要使用延迟初始化。

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保证为零。

在大多数情况下(ELF specification),它被放置到.tbss部分,该部分是零初始化的。

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

  

对于所有其他非本地静态和线程局部变量,为零   初始化发生。在实践中,变量即将到来   零初始化被放置在程序的.bss段中   映像,它在磁盘上不占用空间,并由操作系统清零   加载程序时。