Plu*_*luc 5 c++ singleton thread-local thread-local-storage c++11
这种thread_local存储持续时间的用法是否有任何警告:
template <class T>
inline T &thread_local_get()
{
thread_local T t;
return t;
}
Run Code Online (Sandbox Code Playgroud)
然后在不同的线程中(例如)
thread_local_get<float>() += 1.f;
Run Code Online (Sandbox Code Playgroud)
cppreference 上的文档说明了线程本地存储持续时间:
线程存储持续时间。对象在线程开始时分配,在线程结束时释放。每个线程都有自己的对象实例。只有声明为 thread_local 的对象具有此存储持续时间。thread_local 可以与 static 或 extern 一起出现以调整链接。
这是否thread_local为每个 T(编译期间)和每个调用线程正确分配了一个实例?是否有任何情况会导致例如未定义的行为?
我没有看到理论上的警告,因为在实例化之后,模板的行为(从编译器的角度来看)应该与普通函数完全相同。
不过,我建议在thread_local使用它之前检查您的编译器支持:例如,gcc 有一个类静态成员的错误thread_local,该错误似乎至少在以 gcc 5.1.0 为特色的最新 TDM-GCC 发行版中仍然存在。我不知道这个特定的错误是否也会影响函数的静态成员(它不应该),并且可能您正在使用不同的编译器,但我仍然建议在使用此功能之前进行一些实验。