ConnectionManager
等待传入的连接。对于每个传入连接,它都会创建一个 Connection
实例来处理此连接上的入站和出站流量。每个 Connection
都有一个 Watchdog
来处理“不良连接”情况并调用已注册的“Listerners”。一个“监听器”是 ConnectionManager
,它关闭连接并删除 Connection
实例,后者又删除相应的看门狗。
等等。 A. 分钟。
Watchdog
调用 ConnectionManager
删除 Connection
又删除 Watchdog
?看门狗追着自己的尾部。
我完全被封锁了。我该如何解决这个问题?
解决方案:我会让 Listener 变成异步的,尽管我还不知道如何做到这一点才不会太痛苦。 Watchdog
不知道 ConnectionManager
。这是相当通用的。此外,Win32-Thread-API 没有类似“加入”的功能,因此我可能需要使用 GetExitCodeThread()
和 STILL_ACTIVE
...
谢谢,伙计们。
最佳答案
消息。
不是让 Watchdog 调用 ConnectionManager
的方法,而是将消息发布到连接管理器中的队列。这个队列需要是线程安全的。当 ConnectionManager
在其线程中处理队列时,等待 Connection 线程结束是安全的。
Watchdog Queue ConnectionManager
| | |
Kill Connection---->| |
| |<-------------------Get Message
--- | |
|-------------------->Process Message
| |
| Kill Connection
关于c++ - 线程问题(追自己的尾部),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/349544/