可能重复:
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
您需要使用延迟初始化。
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加载程序时归零。