我正在编写一个C++11类Foo,并且我想为每个实例提供自己的类型为Bar的线程本地存储。也就是说,我希望每个线程和每个Foo实例都分配一个Bar。
如果我使用pthread,Foo将具有非静态成员pthread_key_t类型,Foo的构造函数将使用pthread_key_create()初始化它,Foo的析构函数将使用pthread_key_delete()释放它。或者如果我只编写Microsoft Windows应用程序,我可以使用TlsAlloc()和TlsFree()完成类似的操作。或者如果我使用Boost.Thread,则Foo将具有boost::thread_specific_ptr类型的非静态成员。
然而,实际上,我正在尝试编写可移植的C++11代码。 C++11的thread_local关键字不适用于非静态数据成员。所以,如果您想要每个线程一个Bar,那么没问题,但如果您想要每个线程每个Foo一个Bar,那么就不行了。
因此,据我所知,我需要定义一个从Foos到Bars的线程本地映射,然后处理如何在销毁Foo时适当清理的问题。但在我开始之前,我希望在这里发布,希望有人能阻止我并说“有更简单的方法”。
(顺便说一句,我不使用pthread_key_create()或boost::thread_specific_ptr的原因是,如果我理解正确,它们假定所有线程都使用pthread或Boost.Thread生成。我不想对我的代码的用户如何生成线程做出任何假设。)
如果我使用pthread,Foo将具有非静态成员pthread_key_t类型,Foo的构造函数将使用pthread_key_create()初始化它,Foo的析构函数将使用pthread_key_delete()释放它。或者如果我只编写Microsoft Windows应用程序,我可以使用TlsAlloc()和TlsFree()完成类似的操作。或者如果我使用Boost.Thread,则Foo将具有boost::thread_specific_ptr类型的非静态成员。
然而,实际上,我正在尝试编写可移植的C++11代码。 C++11的thread_local关键字不适用于非静态数据成员。所以,如果您想要每个线程一个Bar,那么没问题,但如果您想要每个线程每个Foo一个Bar,那么就不行了。
因此,据我所知,我需要定义一个从Foos到Bars的线程本地映射,然后处理如何在销毁Foo时适当清理的问题。但在我开始之前,我希望在这里发布,希望有人能阻止我并说“有更简单的方法”。
(顺便说一句,我不使用pthread_key_create()或boost::thread_specific_ptr的原因是,如果我理解正确,它们假定所有线程都使用pthread或Boost.Thread生成。我不想对我的代码的用户如何生成线程做出任何假设。)