C++ 线程问题(追逐自己的尾巴)
有C++ 线程问题(追逐自己的尾巴),c++,multithreading,C++,Multithreading,有ConnectionManager等待传入连接。对于每个传入连接,它创建一个连接实例,用于处理此连接上的入站和出站流量。每个连接都有一个看门狗,它处理“坏连接”情况并调用已注册的“侦听器”。一个“侦听器”是连接管理器,它关闭连接并删除连接实例,然后删除相应的看门狗 等等。一分钟 Watchdog调用ConnectionManager,后者删除连接,后者删除Watchdog?看门狗追逐自己的尾巴 我完全被封锁了。我如何解决这个问题 解决方案:我会让监听器变得异步,尽管我还不知道如何做到这一点而
ConnectionManager
等待传入连接。对于每个传入连接,它创建一个连接
实例,用于处理此连接上的入站和出站流量。每个连接
都有一个看门狗
,它处理“坏连接”情况并调用已注册的“侦听器”。一个“侦听器”是连接管理器
,它关闭连接并删除连接
实例,然后删除相应的看门狗
等等。一分钟
Watchdog
调用ConnectionManager
,后者删除连接
,后者删除Watchdog
?看门狗追逐自己的尾巴
我完全被封锁了。我如何解决这个问题
解决方案:我会让监听器变得异步,尽管我还不知道如何做到这一点而不会太痛苦。
看门狗
不知道连接管理器
。它相当通用。另外,Win32线程API没有类似“join”的功能,因此我可能需要使用GetExitCodeThread()
和仍然处于活动状态的
谢谢,伙计们。留言
不要让看门狗调用ConnectionManager
的方法,而是将消息发布到连接管理器中的队列中。此队列必须是线程安全的。当ConnectionManager
在其线程中处理队列时,可以安全地等待连接线程结束
Watchdog Queue ConnectionManager
| | |
Kill Connection---->| |
| |<-------------------Get Message
--- | |
|-------------------->Process Message
| |
| Kill Connection
看门狗队列连接管理器
| | |
终止连接-->||
||过程消息
| |
|终止连接
信息
不要让看门狗调用ConnectionManager
的方法,而是将消息发布到连接管理器中的队列中。此队列必须是线程安全的。当ConnectionManager
在其线程中处理队列时,可以安全地等待连接线程结束
Watchdog Queue ConnectionManager
| | |
Kill Connection---->| |
| |<-------------------Get Message
--- | |
|-------------------->Process Message
| |
| Kill Connection
看门狗队列连接管理器
| | |
终止连接-->||
||过程消息
| |
|终止连接
如果每个对象都在自己的线程中运行,则没有问题
看门狗通知ConnectionManager并返回。此时,看门狗线程可以退出
当ConnectionManager注意到watchdog事件时,它将终止连接线程。如果这些对象中的每一个都在其自己的线程中运行,则没有问题 看门狗通知ConnectionManager并返回。
此时,看门狗线程可以退出
当ConnectionManager注意到watchdog事件时,它会终止连接线程。如果watchdog在另一个线程中运行,那么问题并不太严重-watchdog用异步消息通知ConnectionManager删除,然后退出它自己的线程 同时,ConnectionManager线程获取删除消息,并开始删除看门狗
为了避免竞争条件,看门狗析构函数应该加入看门狗线程,并清理线程。(可能还向看门狗线程发出信号,或者断言()关于看门狗线程准备退出的信息)。如果看门狗在另一个线程中运行,那么问题并不太严重-看门狗用异步消息向ConnectionManager发出删除的信号,然后退出它自己的线程 同时,ConnectionManager线程获取删除消息,并开始删除看门狗
为了避免竞争条件,看门狗析构函数应该加入看门狗线程,并清理线程。(可能还向看门狗线程发送信号,或断言()看门狗线程准备退出的信息)。如果您非常小心,则不会出现问题
如果它们在同一个线程中,那么Watchdog抛出异常可能是处理ConnectionInstance的更简单的方法 如果你很小心,就没有问题了