我有std :: set有大量唯一对象作为其元素。
在程序的主线程中:
- 我从集合
中获取了一些对象- 将要处理的数据分配给每个
- 从集合
中删除这些对象- 最后将对象传递给线程池中的线程进行处理
- 一旦这些线程完成处理对象,他们就会将它们添加回集合中。 (这样在下一次迭代中,主线程可以再次出现 将下一批数据分配给这些对象进行处理)
醇>
这种安排很完美。但是如果我在向对象添加对象时遇到错误(例如,std::set.insert()
抛出bad_alloc
),那么这一切都会继续折腾。
如果我忽略该错误并继续,则该对象无法返回到处理集中,并且它永远不会超出程序流程,导致内存泄漏。
为了解决这个问题,我试图不从集合中删除对象。相反,有一个成员标志,表明该对象正在被处理'。但在这种情况下,问题是,主要线程遭遇正在处理'迭代遍历set的所有元素时,一次又一次地反对对象。它严重阻碍了性能(集合中的对象数量非常大)。
这里有哪些更好的选择?
可以使用std::list
代替std::set
吗?添加返回元素时列表不会出现bad_alloc
问题,因为它只需要在向列表添加元素时指定指针。但是我们怎样才能使列表元素独一无二?如果我们实现它,它会像std :: set一样有效吗?
有没有办法将元素移动到集合的开头或结尾?而不是将元素移除并添加到std :: set中?因此,未经处理的对象和已处理的对象将一起累积到集合的开始和结束。
还有其他解决方案吗?