1

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

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

4

4 回答 4

7

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

我想我更喜欢你的第二种解决方案——一些管理对象在从集合中删除死对象后看起来。如果不出意外,这将更容易调试,并且锁定逻辑集中在单个对象中。

于 2009-05-14T08:08:28.553 回答
2

我会有卸载队列。

当一个线程注意到连接断开时,它会将对象(和 continer)注册到卸载队列中,尽可能地让一切都上升,然后线程终止。

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

于 2009-05-14T08:41:09.413 回答
1

STL 容器倾向于假设它们正在存储值;可以复制且副本相同的对象。通常,具有线程的对象不太适合该模型。他们有更强烈的认同感。在这种情况下,您肯定有身份 - 容器中对象的副本与外部副本不同。

于 2009-05-14T08:08:33.610 回答
0

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

如何从封装发出它的对象的对象中捕获 C++ boost::signal?

干杯,

克劳迪奥

于 2012-04-16T22:40:19.187 回答