1

我想使用整数键将一些 std::shared_ptr 存储到映射中的 C++ 类实例,例如 std::map。但是,我需要这张地图有两个属性:

  1. 如果键不存在,则返回错误而不是创建新对象。
  2. 如果密钥确实存在,则以原子方式获取 std::shared_ptr 的副本。即,不可能在一个线程中从映射中删除对象,同时在另一个线程中从映射中检索它。

如果可能的话,我想避免使用单个互斥锁(甚至是多次读取,一次写入)来从映射中获取和删除对象,以避免开销。

这样的地图类是否存在于任何库中?如果没有,你能建议如何实施吗?

4

2 回答 2

2

1)使用std::map::at。如果密钥不存在,这将引发异常

2) 使用活动对象访问地图。活动对象负责序列化操作,从而避免竞争条件,但允许您使用普通的旧std::map.

于 2013-02-25T11:10:56.917 回答
2

如果集合中的元素具有互斥锁,您可以简单地使用无锁数据结构。在boost 1.53.0中有用 C++ 实现。

但是,我建议再次查看互斥锁 - 在许多情况下,它们会提供更好的无锁数据结构性能(尽管并非总是如此)并且更容易管理。只要没有互斥体循环,就可以了。

如果您使用 C++03(返回迭代器)或std::map::at如果您使用 C++11(返回引用),则从无创建访问开始使用std::map::find 。

编辑:实际上std::map::at可能更糟,除非您假设正常情况是该元素存在(即违反规则,仅将异常用于异常状态而不是正常操作)。然而,它可能还取决于适用于例外的哲学。

于 2013-02-25T11:14:58.180 回答