【发布时间】:2016-07-19 13:24:43
【问题描述】:
问题
c++11 引入了thread_local,它提供线程本地数据,但不能与非静态数据成员一起使用。
答案是:
...我建议使用
boost::thread_specific_ptr。您可以将其中之一放入您的班级并获得您想要的行为。
但boost::thread_specific_ptr 析构函数附加了以下note:
与此 thread_specific_ptr 关联的所有线程特定实例(可能与此线程关联的实例除外)必须为空。
有没有办法解决这个问题?
我需要用于非静态数据成员的线程本地存储,这将在销毁时释放所有线程数据,即使仍有线程在运行(或至少不会在销毁时失败/泄漏的 tls)。
如果boost::thread_specific_ptr 不是正确的选择,我可以使用受保护的互斥锁std::vector 代替吗?
背景
我有一个从 mongodb 接收数据的 threadsafe 类。
class JsonTable
{
public:
std::string getData() const;
//....
private:
ThreadLocalStorage<mongocxx::client> _clients;
//....
};
mongocxx::client 不得在多个线程之间共享。
因此,为了使getData 线程安全,我需要为每个线程构造一个mongocxx::client。当我的JsonTable 类被破坏时,我希望所有客户端都被关闭/破坏,即使最初创建它们的线程仍在运行。
【问题讨论】:
标签: c++ multithreading boost thread-local-storage