jeyawn
jeyawn
我这边找了一个解决方法,我看网上有说,在进程退出析构里面操作socket是不可靠的,所以可以通过接口主动提前release,大致代码如下:这样没有出现问题 void EventPollerPool::releasePools() { releasePools(); } void TaskExecutorGetterImp::releasePools() { _threads.clear(); } 然后在主线程那里 ,主动调用 releasePools, 这样没有出现问题, InfoL
@tdxlczb 你可以按照我说的,修改下,应该就可以正常退出了。 > > > 定位到原因了,程序退出时,析构EventPoller,调用shutdown,里面通过异步发送task抛出ExitException异常,然后捕获这个ExitException异常,更新_exit_flag,让runLoop里的循环退出。 但是这里会出现一个问题,如果这个抛出ExitException异常的任务稍微有点耗时,就会提前调用close_event,导致内部触发reflock__await_event等待卡死。 > > > > > > > > > 你不要在 EventPoller 加入阻塞任务啊 > > 我没有在EventPoller加入阻塞任务,我这里说的原因还是有点弄错了,可能不是耗时问题,但是肯定是runLoop里的循环没有退出
@xia-chu @PioLing @tdxlczb 我对这个问题修复了一下,验证方法: VS2022编译Release版本,ZLToolKit需要是动态库方式,然后启动MediaServer,未打补丁的时候,通过Ctrl+c 退出服务,必定卡死,卡死原因如上所说,加上补丁后,自测正常。 [ZLMediakit.patch](https://github.com/user-attachments/files/23955142/ZLMediakit.patch) [ZLToolKit.patch](https://github.com/user-attachments/files/23955146/ZLToolKit.patch)