每线程单例使用 thread_local 存储
Per-thread singleton-like using 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 上的文档是这样描述线程本地存储持续时间的:
thread storage duration. The object is allocated when the thread begins and deallocated when the thread ends. Each thread has its own instance of the object. Only objects declared thread_local have this storage duration. thread_local can appear together with static or extern to adjust linkage.
这是否正确地为每个 T(在编译期间)和每个调用线程分配了一个 thread_local
实例?是否有任何情况会导致例如未定义的行为?
我没有看到理论上的警告,因为在实例化之后,模板的行为(从编译器的角度来看)应该与普通函数完全一样。
不过,我建议在使用它之前检查你的编译器对 thread_local
的支持:例如 gcc 有 a bug with class static thread_local
members 似乎至少在最新的 TDM-GCC 发行版中仍然存在 gcc 5.1.0。我不知道这个特定的错误是否也会影响函数的静态成员(它不应该)并且可能您使用的是不同的编译器,但我的建议仍然是在使用此功能之前进行一些实验。
使用 thread_local
存储期限是否有任何注意事项:
template <class T>
inline T &thread_local_get()
{
thread_local T t;
return t;
}
然后在不同的线程中(例如)
thread_local_get<float>() += 1.f;
cppreference 上的文档是这样描述线程本地存储持续时间的:
thread storage duration. The object is allocated when the thread begins and deallocated when the thread ends. Each thread has its own instance of the object. Only objects declared thread_local have this storage duration. thread_local can appear together with static or extern to adjust linkage.
这是否正确地为每个 T(在编译期间)和每个调用线程分配了一个 thread_local
实例?是否有任何情况会导致例如未定义的行为?
我没有看到理论上的警告,因为在实例化之后,模板的行为(从编译器的角度来看)应该与普通函数完全一样。
不过,我建议在使用它之前检查你的编译器对 thread_local
的支持:例如 gcc 有 a bug with class static thread_local
members 似乎至少在最新的 TDM-GCC 发行版中仍然存在 gcc 5.1.0。我不知道这个特定的错误是否也会影响函数的静态成员(它不应该)并且可能您使用的是不同的编译器,但我的建议仍然是在使用此功能之前进行一些实验。