Как инициализировать локальную переменную потока в 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 программы образ, который не занимает места на диске, и обнуляется ОС при загрузке программы.