每线程单例使用 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。我不知道这个特定的错误是否也会影响函数的静态成员(它不应该)并且可能您使用的是不同的编译器,但我的建议仍然是在使用此功能之前进行一些实验。