对象从容器中删除自身

时间:2009-05-14 08:00:05

标签: c++ containers

所以我有一个容器(任何类型,可能是std :: map或std :: vector),它包含一个类的对象,其中一些网络事物在一个线程中运行,检查它是否仍然连接(该线程在内部定义)那个类,并在构建时启动。)

有什么方法可以让对象在断开连接时从容器中删除自己,还是应该将线程移到对象外面并使用该类来存储数据?

4 个答案:

答案 0 :(得分:7)

为了让对象从容器中删除它,它必须知道它所在的容器。你需要在对象中维护一个指向容器的指针。您还必须使用锁来保护容器,以阻止多个线程同时访问容器。

我认为我更喜欢你的第二个解决方案 - 一些管理对象会从集合中删除死对象。如果不出意外,这将更容易调试,锁定逻辑集中在一个对象中。

答案 1 :(得分:2)

我会卸载队列。

当一个线程注意到连接已关闭时,它会将对象(和continer)注册到卸载队列,尽可能地将所有内容整理好,然后thred终止。

然后在卸载队列中有一个单独的线程。其唯一目的是监控队列。当它在队列中看到一个新对象时,将其从容器中删除然后销毁它(根据需要与对象线程同步)。

答案 2 :(得分:1)

STL容器倾向于假设它们存储值;可以复制的对象和副本相同的对象。通常,具有螺纹的对象很难适应该模型。他们有更强烈的认同感。在这种情况下,您肯定有密码 - 容器中对象的副本与外部副本不同。

答案 3 :(得分:0)

我遇到了一个与你的问题非常相似的问题,我通过从"网络事件"中发出 boost :: signal 来解决这个问题。当它检测到断开连接时,被管理容器的对象捕获。收到该信号后,它将遍历容器,从中移除死网络会话。这可能值得一看:

How to make a C++ boost::signal be caught from an object which encapsulates the object which emits it?

干杯,

克劳迪奥