以原子方式访问存储在映射中的资源
Atomically accessing resources stored in a map
我想使用整数键将一些std::shared_ptr到C++类实例存储在映射中,例如std::映射。然而,我需要这个地图有两个属性:
- 如果键不存在,则返回一个错误,而不是创建一个新对象
- 如果密钥确实存在,那么以原子方式获取std::shared_ptr的副本。也就是说,不可能在一个线程中从映射中删除对象,同时在另一个线程从映射中检索对象
如果可能的话,我希望避免使用单个互斥(甚至是多读、单写(来从映射中获取和删除对象,以避免开销。
这样的map类在任何库中都存在吗?如果没有,你能建议如何实施吗?
如果集合中的元素具有互斥对象,则可以简单地使用无锁数据结构。在boost 1.53.0中的C++中实现了。
然而,我建议再次考虑互斥锁——在许多情况下,它们将提供更好的性能——无锁数据结构(尽管并非总是如此(,并且更容易管理。只要没有互斥对象的循环,你就应该没事。
在不创建的情况下访问时,如果使用C++03(返回迭代器(,请使用std::map::find;如果使用C++11(返回引用(,则使用std::map::at。
EDIT:实际上std::map::at可能更糟,除非您假设正常情况下元素存在(即,违反仅对异常状态而非正常操作使用异常的规则(。然而,这可能也取决于适用于例外情况的哲学。
1(使用std::map::at。如果密钥不存在,则会引发异常
2( 使用活动对象访问地图。活动对象负责序列化操作,从而避免竞争条件,但允许您使用普通的旧std::map
。
相关文章:
- 具有瞬态资源的RAII类
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 将函数类成员映射到类本身内部
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 使用std::函数映射对象方法
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- C++映射分割错误(核心转储)
- 内联映射初始化的动态atexit析构函数崩溃
- 使用"std::unordereded_map"映射到"std::list"对象
- 如何从多映射中删除特定的重复项
- 在未初始化映射的情况下,将值插入到映射的映射中
- QT通过C++添加映射QML项目
- 我尝试使用MAP容器来映射资源,现在RESOURCEFILE正在获取所有信息.为什么
- 类型映射资源并将列表转换为矢量(并返回)
- 映射资源并在direct3d11中分配数据
- std::映射多线程中奇怪的资源争用
- 以原子方式访问存储在映射中的资源