我正在编写一个C++ 11类Foo,我想给每个实例提供自己的Bar类型的线程本地存储.也就是说,我希望每个线程和每个Foo实例分配一个Bar .
如果我使用pthreads,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的原因是,如果我理解正确,他们会假设所有线程将分别使用pthreads或Boost.Thread生成.我不想做关于我的代码的用户将如何产生线程的任何假设.)