我有一个flyweight模式串行工作,工厂使用std::map
存储并提供对创建对象的访问。工厂返回指向地图中对象的iterator
。工厂中的对象是常量,因此一旦插入它们就不会更新,除非它们被擦除。
我想使用tbb::concurrent_hash_map
使工厂并发,但我不确定返回应该是什么。我可以使用iterator
(它应该是const_iterator
吗?),但文档说明当find
或insert
中的concurrent_hash_map
或const_accessor
有效时,所有迭代器都会失效}}。所以我可以使用iterator
,因为只需要只读访问,但这与串行实现(accessor
vs {{1}})不同。
哪一个更好用?类型(即两个迭代器)的一致性是否重要?串行和线程编译时选项都需要存在。
答案 0 :(得分:2)
如果您没有与访问地图的其他线程同时删除元素,则可以使用tbb::concurrent_unordered_map
代替。这也是一个基于哈希的关联容器,但更简单,更像STL的API。 不使insert
和find
的迭代器无效,但作为权衡,它不允许同时删除元素。
如果确实需要同时删除元素,TBB的唯一选择是将tbb::concurrent_hash_map
与访问者一起使用。
我还建议您在the TBB forum讨论您的用例。