像使用thread_local存储一样的单线程

Per-thread singleton-like using thread_local storage

本文关键字:一样 单线程 存储 thread local      更新时间:2023-10-16

对于thread_local存储持续时间的使用有任何注意事项吗:

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

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

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

cppreference上的文档这样描述线程本地存储持续时间:

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

这是否正确地为每个T(在编译期间)和每个调用线程分配了一个thread_local实例?有没有什么情况会导致不明确的行为?

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

尽管如此,我还是建议在使用thread_local之前检查一下编译器对它的支持:例如,gcc有一个类静态thread_local成员的错误,至少在最新的以gcc 5.1.0为特色的TDM-gcc发行版中似乎仍然存在。我不知道这个特定的bug是否也会影响函数的静态成员(不应该),而且可能你使用的是不同的编译器,但我的建议是在使用这个功能之前做一些实验。