通过线程本地存储访问shared_ptr
Accessing shared_ptr via thread local storage
我收集了这样的信息:
std::list< boost::shared_ptr<DataEntry> > m_Entries;
该列表可由多个线程访问。大多数情况下,只读取列表,但偶尔线程需要添加或删除列表中的条目。因此,列表本身受读写器锁保护,但条目不受保护。
单个条目本身大多是不可变的(少数很少访问的可变成员被单独锁定以防止并发问题),shared_ptr
用于确保在线程读取条目时不会删除条目,即使另一个线程从列表中删除了该条目。
访问的性质是,给定线程通常会重复访问一个特定条目,偶尔还会访问另一个(变化的)条目。数据是否陈旧并不重要,只要在使用中没有删除即可。目前,每当它需要一个条目时,它都必须获取锁,搜索列表,复制shared_ptr
,然后释放锁。线程无法在访问之间存储指针;它每次都必须释放和重新获取。
因此,我认为在线程本地存储中缓存最常用的条目(作为shared_ptr
或weak_ptr
)可能会带来性能优势,从而避免在最常见的情况下必须获取锁。
不幸的是,我使用的是VS2008,它的__declspec(thread)
不支持非POD类型,例如智能指针。我不能存储裸指针,因为这不会提供我需要的不删除保证。我想我可以存储一个weak_ptr*
,但这会导致线程退出时内存泄漏(和引用计数不足)(尽管我确实有一个钩子在"正常"线程退出时被调用,所以这可以稍微减轻一点)。出于显而易见的原因,存储shared_ptr*
可能会更糟。
考虑到锁的复杂性,而且锁通常是不受控制的,我不确定这种可能微不足道的性能提升是否值得这么麻烦。但我想知道我是否错过了更好的方法。(我也很好奇C++11中的情况是否有所改善,因为它有更好的线程支持。)
试试Boost的线程本地存储-我很乐观它可能与您的VS2008编译器一起工作。
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 用于访问容器<T>数据成员的正确 API
- 访问者访问变体并返回不同类型时出错
- 尝试通过多个向量访问变量时,向量下标超出范围
- 无法访问嵌套类.类的使用无效
- 写入位置0x0000000C时发生访问冲突
- 我们可以访问一个不存在的联盟的成员吗
- C++从另一个类访问公共静态向量的正确方法是什么
- 我的简单if-else语句是如何无法访问的代码
- 从C++dll访问C#中的一行主要参数
- 概念TS检查忽略私有访问修饰符
- 访问被拒绝后,c++中的故障保护代码
- 在c++中访问int到类对象的映射时出错
- 我想访问std::unique_ptr中的一个特定元素
- 为什么示例代码访问IUnknown中已删除的内存
- C++:无法访问声明的受保护成员
- 通过指向指针数组的指针访问子类的属性
- 链接 boost 库时"Error while loading shared libraries"引发的,除了我无法使用 root 访问权限来修复它