集合中的引用计数

时间:2014-11-19 07:40:40

标签: c++ multithreading collections stl reference-counting

让我们有一个对象集合(比如字符串是集合的类型)。我希望集合的每个元素都有一个引用计数。因此,在 Add-Usage 上,它应该增加这个给定元素的计数。

coll.AddUsage("SomeElement"); // Type doesn't matter - but should increase count

On, Release-Usage ,它应该减少给定元素的引用计数,如果count达到0,那么它应该从集合中删除元素。

如果AddUsage将分配元素(并将引用计数设置为1),或者完全失败(因为元素不存在),这一点并不重要。重要的是RemoveUsage,它应该从集合中删除给定的元素(对象)。

我想过使用vector(或自定义结构)的pair,或使用任何类型的map / multimap。 C ++库中不存在现有的类(可能不在线程支持库,一个原子类,共享指针类等)。

问题:

那么,我的问题是如何使用现有的C ++库来实现这样的想法?它应该是线程安全的。是的,C ++ 11/14对我来说完全没问题。如果有好主意,我可能会在模板之上制作它。

3 个答案:

答案 0 :(得分:2)

假设您要求数据结构来实现引用计数集合......

使用带有K的map<K,V>作为集合元素的类型(在示例字符串中)和V a类型来跟踪有关元素的元信息(例如引用计数)。最简单的情况是V为int

然后,AddUsage很简单,只需refMap[value]++。对于RemoveUsage,只需执行refMap[value]--,然后检查计数器是否为零,并从地图中删除该值。

您也需要添加错误处理,因为AddUsage / RemoveUsage可能是 使用不在地图中的对象调用(未添加到集合中)

编辑:您使用&#34;多线程&#34;标记了您的问题,因此您可能希望使用某种互斥锁来保护对refMap的并发访问。

答案 1 :(得分:1)

你可以实现类似于shared_ptr类的东西,但是可以扩展它来保存对象的集合。

就像你可以设计一个以map/multimap为数据成员的类。键将是您的对象,值是您的引用计数。就接口而言,只需公开两种方法: -

AddUsage(Object);
RemoveUsage(Object);

在AddUsage方法中,首先要检查map中是否已存在元素。如果是,则只增加计数。同样,您将处理RemoveUsage.Object如果其引用计数达到零,将从映射中删除。

这只是我的意见。如果此实施中存在任何瓶颈,请告诉我。

答案 2 :(得分:-3)

您可以在结构或类中使用静态成员(整数)变量。你想要的增量或减量。如果值为零,则删除元素。