有ConnectionManager在等待传入的连接。对于每个传入连接,它创建一个Connection实例,该实例处理此连接上的入站和出站通信量。每个Connection都有一个Watchdog,它处理“坏连接”条件,并调用已注册的"Listerners“。一个“侦听器”是ConnectionManager,它关闭连接并删除Connection实例,后者反过来删除相应的看门狗。
等。A.分钟。
Watchdog调用删除删除Watchdog的Connection的ConnectionManager?看门狗追逐自己的尾巴。
我被完全堵住了。我该怎么解决这个问题?
解决方案:我将使侦听器变得异步,尽管我还不知道如何做到这一点,而不会带来太多的痛苦。Watchdog不知道ConnectionManager的事。这是相当通用的。此外,with 32-Thread没有类似于“联接”的东西,所以我可能需要使用GetExitCodeThread()和STILL_ACTIVE来滚动我自己的.
谢谢伙计们。
发布于 2008-12-08 13:48:15
如果看门狗运行在不同的线程中,那么问题就不太严重了--看门狗用异步消息指示ConnectionManager删除,然后退出它自己的线程。
同时,ConnectionManager线程获取删除消息,并开始删除看门狗。
为了避免比赛条件,看门狗析构函数应该加入看门狗线程,并清理线程。(也可能是向看门狗线程发出信号,或者断言()关于看门狗线程准备退出的内容)。
发布于 2008-12-08 13:35:06
发短信。
与其让看门狗调用ConnectionManager的方法,不如向连接管理器中的队列发送一条消息。此队列需要线程安全。当ConnectionManager在其线程中处理队列时,等待连接线程结束是安全的。
Watchdog Queue ConnectionManager
| | |
Kill Connection---->| |
| |<-------------------Get Message
--- | |
|-------------------->Process Message
| |
| Kill Connection发布于 2008-12-08 13:36:07
如果每个对象都在自己的线程中运行,则没有问题。
看门狗通知ConnectionManager并返回。
此时,看门狗线程可以退出。
当ConnectionManager注意到看门狗事件时,它会杀死连接线程。
https://stackoverflow.com/questions/349544
复制相似问题