【问题标题】:Accessing shared_ptr via thread local storage通过线程本地存储访问 shared_ptr
【发布时间】:2012-02-14 02:17:21
【问题描述】:

我有一个这样的信息集合:

std::list< boost::shared_ptr<DataEntry> > m_Entries;

列表被多个线程访问。大多数情况下,该列表仅被读取,但有时线程需要从列表中添加或删除条目。因此,列表本身受读/写锁保护,但条目不受保护。

各个条目本身大多是不可变的(有几个很少访问的可变成员单独锁定以防止并发问题),shared_ptrs 用于确保在线程读取条目时不会删除条目,即使另一个线程从列表中删除了该条目。

访问的本质是,一个给定的线程通常会重复访问一个特定的条目,偶尔也会访问另一个(变化的)条目。数据是否陈旧无关紧要,只要在使用时未删除即可。目前,每次它需要一个条目时,它必须获取锁,搜索列表,复制shared_ptr,然后释放锁。线程无法在访问之间存储指针;它必须每次释放并重新获取。

因此,我认为在线程本地存储中缓存最常用的条目(如shared_ptrweak_ptr)可能会带来性能优势,从而避免在最根本上获取锁常见情况。

不幸的是,我使用的是 VS2008,它的__declspec(thread) 不支持智能指针等非 POD 类型。我不能存储一个裸指针,因为它不能提供我需要的非删除保证。我想我可以存储一个weak_ptr* 但这会导致线程退出时内存泄漏(和弱引用计数)(尽管我确实有一个在“正常”线程退出时被调用的钩子,所以这可以减轻一点) .出于希望显而易见的原因,存储 shared_ptr* 会更糟。

考虑到复杂性,并且锁通常是无争用的,我不确定这种可能微不足道的性能提升是否值得麻烦。但我想知道我是否错过了更好的方法。 (我也很好奇 C++11 是否有所改进,因为它有更好的线程支持。)

【问题讨论】:

标签: c++ multithreading shared-ptr smart-pointers thread-local


【解决方案1】:

试试 Boost 的 Thread Local Storage - 我很乐观,它可能适用于您的 VS 2008 编译器。

【讨论】:

  • 看起来类似于我上面提到的weak_ptr*-with-hook-cleanup 想法。不过,它有点整洁,所以我会看看它是怎么回事。
猜你喜欢
  • 2015-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-29
  • 2010-12-24
  • 2014-12-22
相关资源
最近更新 更多