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

How to initialize thread local variable in c++?

本文关键字:初始化 线程 局部变量 c++      更新时间:2023-10-16

可能重复:
gcc中的C++11 thread_local-备选方案
有没有任何方法可以使用GCC';s __线程?

我想使用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

您需要使用惰性初始化。

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;
}

保证CCD_ 3为零。

在大多数情况下(ELF规范),它被放在.tbss部分,该部分初始化为零。

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

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