原子访问存储在地图资源(Atomically accessing resources stored

2019-10-17 17:53发布

我想储存一些的std :: shared_ptr的C ++的类的实例中的地图,例如一个std ::地图,使用整数键。 不过,我需要这个地图有两个属性:

  1. 如果该键不存在,则返回一个错误,而不是创建新的对象。
  2. 如果密钥确实存在,然后抓住STD副本::原子shared_ptr的。 也就是说,它不应该是可以删除从地图的目的是在一个线程,同时从在其他地图上检索它。

我想,以避免为获得和从地图如果可能的话删除对象,避免了开销单互斥(甚至多读,单写)。

难道这样的地图类在任何图书馆存在吗? 如果没有,你可以建议如何实现呢?

Answer 1:

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

不过,我会建议在互斥看一次 - 在许多情况下,他们将提供更好的性能无锁数据结构(但并不总是),并且更容易管理。 只要不存在互斥的循环,你应该罚款。

由于访问没有创造使用的std ::地图::找到 ,如果你使用C ++ 03(iterator返回)或性病::地图::在 ,如果你使用C ++ 11(返回参考)。

编辑 :其实标准::地图::在可能是糟糕的,除非你认为正常情况下是元素存在(即违反规定使用例外仅适用于特殊的状态,而不是正常操作)。 但是它可能也取决于理念之一适用例外。



Answer 2:

1)使用的std ::地图::在 。 如果该键不存在,这将引发异常

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



文章来源: Atomically accessing resources stored in a map