如何初始化线程局部变量在C ++? [重复](How to initialize thread

2019-07-31 03:28发布

可能重复:
C ++ 11 thread_local在GCC -替代品
有没有办法完全模仿thread_local使用GCC的__thread?

我想用C ++ 11 thread_local创建和使用thread_local变量,但它尚未由海湾合作委员会的支持,我用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

Answer 1:

您需要使用延迟初始化。

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规范 )它被放置到.tbss部,其被初始化为零。

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

对于所有其他非本地静态和线程局部变量,零初始化发生。 在实践中,会变量是零初始化放置在节目图像,其占据在磁盘上没有空间的的.bss段,并且由OS加载程序时归零。



文章来源: How to initialize thread local variable in c++? [duplicate]