与TBB并行的工厂/蝇量级

Concurrent factory/flyweight with TBB

本文关键字:工厂 TBB 并行      更新时间:2023-10-16

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

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

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

如果不在其他线程访问映射的同时擦除元素,则可以使用tbb::concurrent_unordered_map。这也是一个基于哈希的关联容器,但具有更简单、更类似STL的API。它不会使insertfind的迭代器失效,但作为一种折衷,它不允许同时删除元素。

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

我还建议您在TBB论坛上讨论您的用例。