0

我有 std::set 有大量唯一对象作为其元素。

在程序的主线程中:

  1. 我从片场拿了一些东西
  2. 将要处理的数据分配给它们中的每一个
  3. 从集合中移除这些对象
  4. 最后将对象传递给线程池中的线程进行处理
  5. 一旦这些线程完成处理对象,它们就会将它们添加回集合中。(这样在下一次迭代中,主线程可以再次将下一批数据分配给这些对象进行处理)

这种安排很完美。但是,如果我在将对象添加回集合时遇到错误(例如std::set.insert()throws bad_alloc),那么一切都会继续。如果我忽略该错误并继续,那么对象将无法返回处理集中,并且它永远不会出现在程序流之外,从而导致内存泄漏。

为了解决这个问题,我尽量不要从集合中移除对象。相反,有一个成员标志,指示对象正在“正在处理”。但在这种情况下,问题是,主线程在遍历集合的所有元素时一次又一次地遇到“正在处理”的对象。它严重影响了性能(集合中的对象数量非常大)。

这里有什么更好的选择?

  1. 可以std::list用来代替std::set吗?列表在添加元素时不会有bad_alloc问题,因为它只需要在向列表添加元素时分配指针。但是我们如何才能使列表元素独一无二呢?如果我们实现了它,它会像 std::set 一样有效吗?

  2. 有没有办法元素移动到集合的开头或结尾,而不是删除和添加回元素到 std::set?这样未处理的对象和已处理的对象将一起累积到集合的开始和结束。

  3. 请问还有什么解决办法吗?

4

0 回答 0