Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对象从容器中删除自身_C++_Containers - Fatal编程技术网

C++ 对象从容器中删除自身

C++ 对象从容器中删除自身,c++,containers,C++,Containers,因此,我有一个容器(任何类型,可能是std::map或std::vector),其中包含一个类的对象,该类的某个网络对象运行在一个线程中,该线程检查它是否仍然连接(该线程在该类中定义,并在构造时启动) 有什么方法可以让对象在断开连接时从容器中删除自身,或者我应该将线程移到对象外部并使用该类来存储数据?为了让对象从容器中删除自身,它必须知道它在哪个容器中。您需要在对象中维护指向容器的指针。您还必须使用锁来保护容器,以阻止多个线程同时访问容器 我想我更喜欢你的第二个解决方案——一些管理对象负责从集合

因此,我有一个容器(任何类型,可能是std::map或std::vector),其中包含一个类的对象,该类的某个网络对象运行在一个线程中,该线程检查它是否仍然连接(该线程在该类中定义,并在构造时启动)


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

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


我想我更喜欢你的第二个解决方案——一些管理对象负责从集合中删除死对象。如果没有其他内容,这将更容易调试,并且锁定逻辑将集中在单个对象中。

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


我想我更喜欢你的第二个解决方案——一些管理对象负责从集合中删除死对象。如果没有其他东西,这将更容易调试,并且锁定逻辑将集中在单个对象中。

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

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

我将拥有一个卸载队列

当线程注意到连接已断开时,它将对象(和continer)注册到卸载队列中,尽可能地将所有内容向上倾斜,然后thred终止


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

我将使用am卸载队列

当线程注意到连接已断开时,它将对象(和continer)注册到卸载队列中,尽可能地将所有内容向上倾斜,然后thred终止


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

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

干杯


Claudio

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

干杯


克劳迪奥“倾向于假设”?假定或不假定存储的对象是值:它们不是人!STL容器仅存储值。当然,这些值可能是指针。“倾向于假设”?假定或不假定存储的对象是值:它们不是人!STL容器仅存储值。当然,这些值可能是指针;作业队列(我在从容器卸载对象时使用术语unload)。您只需将作业放置在队列上(在本例中,作业是从容器卸载/删除对象)。然后一个单独的线程一次处理一个作业;作业队列(我在从容器卸载对象时使用术语unload)。您只需将作业放置在队列上(在本例中,作业是从容器卸载/删除对象)。然后,一个单独的线程一次处理一个作业。