使用thread_local存储的每线程单一类似

时间:2015-11-24 23:17:59

标签: c++ c++11 singleton thread-local thread-local-storage

thread_local存储时间的使用是否有任何警告:

template <class T>
inline T &thread_local_get()
{
  thread_local T t;
  return t;
}

然后在不同的线程中(例如)

thread_local_get<float>() += 1.f;

cppreference上的doc说明了有关线程本地存储持续时间的信息:

  

线程存储持续时间。线程开始时分配对象,线程结束时分配对象。每个线程都有自己的对象实例。只有声明为thread_local的对象才具有此存储持续时间。 thread_local可以与static或extern一起出现以调整链接。

这是否为每个T(编译期间)和每个调用线程正确分配了一个thread_local实例?是否存在任何可能导致未定义行为的情况?

1 个答案:

答案 0 :(得分:0)

我没有看到理论上的警告,因为在实例化之后,模板的行为(从编译器的角度来看)与正常函数完全相同。

不过,我建议在使用它之前检查一下thread_local的编译器支持:例如gcc有a bug with class static thread_local members,它似乎至少仍然存在于最新的具有gcc 5.1的TDM-GCC发行版中。 0。我不知道这个特定的bug是否也会影响函数的静态成员(它不应该),可能你使用的是不同的编译器,但我的建议仍然是在使用这个功能之前进行一些实验。