10

可能重复:
gcc 中的 C++11 thread_local - 替代方案
有没有办法使用 GCC 的 __thread 完全模拟 thread_local?

我想使用 c++11thread_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

4

1 回答 1

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

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

对于所有其他非局部静态和线程局部变量,零初始化发生。实际上,将要进行零初始化的变量放在程序映像的 .bss 段中,该段不占用磁盘空间,并在加载程序时被操作系统清零。

于 2012-08-22T14:35:12.507 回答