Как инициализировать локальную переменную потока в C++? [дубликат]
Возможные Дубликаты:
C++11 thread_local в gcc-альтернативы
есть ли способ полностью эмулировать thread_local с помощью __thread GCC?
Я хотел использовать c++11 thread_local
для создания и использования переменной thread_local, но поскольку она еще не поддерживается gcc, я использую GCC specific __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
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
гарантированно равен нулю.
в большинстве случаев (спецификация эльф) он помещается .раздел tbss, который инициализируется нулем.
Для C++ - http://en.cppreference.com/w/cpp/language/initialization
для всех других нелокальных статических и поток-локальных переменных, ноль инициализация происходит. На практике переменные, которые будут к быть нулевым-инициализируются помещаются в .сегмент bss программы образ, который не занимает места на диске, и обнуляется ОС при загрузке программы.