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