与TBB同时出厂/飞重

时间:2012-01-17 20:33:37

标签: c++ factory-pattern tbb

我有一个flyweight模式串行工作,工厂使用std::map存储并提供对创建对象的访问。工厂返回指向地图中对象的iterator。工厂中的对象是常量,因此一旦插入它们就不会更新,除非它们被擦除。

我想使用tbb::concurrent_hash_map使工厂并发,但我不确定返回应该是什么。我可以使用iterator(它应该是const_iterator吗?),但文档说明当findinsert中的concurrent_hash_mapconst_accessor有效时,所有迭代器都会失效}}。所以我可以使用iterator,因为只需要只读访问,但这与串行实现(accessor vs {{1}})不同。

哪一个更好用?类型(即两个迭代器)的一致性是否重要?串行和线程编译时选项都需要存在。

1 个答案:

答案 0 :(得分:2)

如果您没有与访问地图的其他线程同时删除元素,则可以使用tbb::concurrent_unordered_map代替。这也是一个基于哈希的关联容器,但更简单,更像STL的API。 使insertfind的迭代器无效,但作为权衡,它不允许同时删除元素。

如果确实需要同时删除元素,TBB的唯一选择是将tbb::concurrent_hash_map与访问者一起使用。

我还建议您在the TBB forum讨论您的用例。