如何在模板中声明线程本地静态

edA*_*a-y 5 c++ multithreading gcc

如何在模板类中定义一个也是线程局部的静态成员变量?我想我已经想出如何在GCC中做到这一点,但是想确认这在链接,初始化和解析方面都能正常工作.另外,转换到另一个编译器会很有用(比如MSVC),所以我可以得到一个很好的宏来做到这一点.

template<typename T>
class my_class
{
  struct some_type { };
  static __thread some_type * ptr;
};

template<typename T>
__thread typename my_class<T>::some_type * my_class<T>::ptr = 0;
Run Code Online (Sandbox Code Playgroud)

实现相同的事情的另一种方法也是可以的(也就是说,每个模板实例使用一个不同的线程本地).

ice*_*ime 2

我相信您的代码是正确的,并且可以通过替换为 MSVC 进行翻译__thread__declspec(thread)请参阅MSDN 上的线程本地存储):

template<typename T>
class my_class
{
  struct some_type { };
  static __declspec(thread) some_type * ptr;
};

template<typename T>
__declspec(thread) typename my_class<T>::some_type * my_class<T>::ptr = 0;
Run Code Online (Sandbox Code Playgroud)