【问题标题】:Thread-safe TBB::concurrent_hash_map erase线程安全的 TBB::concurrent_hash_map 擦除
【发布时间】:2016-01-21 21:28:28
【问题描述】:

我正在寻找线程安全映射的解决方案,但包括 tbb,所有内容库对于擦除、清除功能都不是线程安全的。由于性能问题,我不想使用互斥锁。我正在互联网上搜索它很长一段时间,但我仍然找不到任何关于此的示例,而且我对长篇文章的英语不好。我搜索了很多东西,比如 const 对于 c++11 是线程安全的,但我无法弄清楚。

我试过这个来复制地图,但它也不是线程安全的。

 __forceinline ActiveMap & GetActiveMap() { return m_activeCollection; }

当我尝试在另一个线程中复制地图时,此代码崩溃。

【问题讨论】:

  • 你错了,tbb::concurrent_hash_map::erase 是线程安全的
  • 整个容器操作,如赋值或复制不是线程安全的。您可以使用tbb::spin_rw_lock 来保护它以便拍摄快照

标签: c++ multithreading c++11 tbb


【解决方案1】:

(我猜你正在使用 Visual C++,因为 __forceinline 关键字`)

  1. Visual Studio 2013(我猜是 Visual Studio 2015)带有一小组并发数据结构。标头<concurrent_unordered_map.h> 实现了可以使用的并发映射。

  2. 尝试使用锁分析您的应用程序。苗条的读写器锁通常不是那么糟糕,可能就足够了。

【讨论】:

  • 我正在使用 Visual Studio 2015,我会使用读卡器锁定来查找、开始、结束并使用写入来插入和擦除吗?
  • 用它做任何事情。对 const 的每个函数使用读取模式,对不是 const 的 ebery 函数使用写入模式。令人惊讶的是,const 自从语言刚刚出现以来就提出了线程安全性!
  • 我添加了一个新的答案,我写了一个代码,你知道提高性能的技巧吗?
  • TBB 具有相同的concurrent_unordered_map
  • 但是concurrent_unordered_map 没有线程安全的unsafe_erase()
猜你喜欢
  • 1970-01-01
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 2014-01-20
  • 1970-01-01
相关资源
最近更新 更多