2016-01-21 644 views
0

我正在寻找线程安全映射的解决方案,但包括tbb所有内容库都不是线程安全的用于擦除,清除函数。我不想因为性能问题使用互斥锁。我在互联网上搜索了很长时间,但我仍然无法找到任何有关这方面的例子,而且我对长文章也有不好的看法。我搜索了很多东西,例如const,对于C++ 11来说是线程安全的但我无法弄清楚。线程安全的TBB :: concurrent_hash_map擦除

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

__forceinline ActiveMap & GetActiveMap() { return m_activeCollection; } 

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

+1

你错了,'tbb :: concurrent_hash_map :: erase'是线程安全的 – Anton

+0

整个容器操作如赋值或拷贝不是线程安全的。您可以使用'tbb :: spin_rw_lock'为了保护它以便拍摄快照 – Anton

回答

2

(我猜你是使用Visual C++,因为__forceinline keyword`的)

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

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

+0

我使用的是visual studio 2015,我将使用reader lock来查找,开始,结束和使用write进行插入和擦除吗? – 0sk1

+0

用它来做任何事情。为每个函数使用read模式,const函数和写模式的ebery函数不是'const'。令人惊讶的是,自从语言刚刚诞生以来,const建议的线程安全性如何? –

+0

我添加了一个新的答案,我编写了一个代码,你知道更多的技巧来提高性能吗? – 0sk1