与TBB并行的工厂/蝇量级
Concurrent factory/flyweight with TBB
我有一个串行工作的轻量级模式,工厂使用std::map
来存储和提供对创建对象的访问。工厂返回指向映射中对象的iterator
。工厂中的对象是常量,因此一旦插入,它们将不会更新,除非它们被擦除。
我想使用tbb::concurrent_hash_map
使工厂并发,但我不确定返回值应该是什么。我可以使用iterator
(它应该是const_iterator
吗?),但文档说,当concurrent_hash_map
中有find
或insert
时,所有迭代器都无效。所以我可以使用const_accessor
,因为只需要只读访问,但这与串行实现不同(iterator
与accessor
)。
哪一个更好用?类型(即两个迭代器)的一致性是否重要?串行和线程编译时选项都需要存在。
如果不在其他线程访问映射的同时擦除元素,则可以使用tbb::concurrent_unordered_map
。这也是一个基于哈希的关联容器,但具有更简单、更类似STL的API。它不会使insert
和find
的迭代器失效,但作为一种折衷,它不允许同时删除元素。
如果确实需要同时删除元素,那么使用TBB的唯一选择是将tbb::concurrent_hash_map
与访问器一起使用。
我还建议您在TBB论坛上讨论您的用例。
相关文章:
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 使用Unique_ptr确保工厂中的对象唯一
- 带有继承的C++工厂
- 英特尔 TBB 程序不会终止,可能会误用参考计数器
- 如何在工厂方法中返回指向基于基础操作系统的派生类的有效指针
- tbb::p arallel_for_each 在取消时未执行
- 工厂方法:分配和strcpy_s的差异
- C++库和自注册类:客户端应用程序中的工厂映射为空
- 如何完全关闭 TBB 代码中的线程
- 这个工厂类在这个C++视频中的意义何在?
- 此工厂功能有什么问题?
- Tbb 库:错误:编写自定义类函数而不是 lambda 表达式时,对函数的调用不匹配
- 注册对对象工厂的调用会导致段错误
- 注册 TBB 的环境变量
- 工厂设计模式优化
- 在 C++ 中返回新的构造函数(*this)工厂
- 如何将 tbb concurrent_hash_map转换为常规标准::地图?
- 确保在编译期间仅同时使用来自同一工厂的对象
- 在工厂或C++类中包含数据库 .h 文件
- 与TBB并行的工厂/蝇量级