可能重复:
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
答案 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段中 映像,它在磁盘上不占用空间,并由操作系统清零 加载程序时。