-
Notifications
You must be signed in to change notification settings - Fork 206
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
下一个版本解决问题。 #29
Comments
我尝试过,直接用runinthisloop,去执行async_->close,和uv_stop(handle),但是产生一个问题,eventloop中的async_的uv handle_是只能在之后的事件循环中被回调delete,像这样 |
类似signal也是一样,只能主动调用close,并且当前的eventloop是正常执行的。 |
@x724172556 |
我想到了一个方法,但没有尝试过,就是eventloop添加一个接口,close(callback),我们在callback回调中执行关闭其他句柄的操作,例如tcpserver,此时uv_loop是已经停止了,下一次是无法进入循环的,真正的关闭句柄操作是无法执行的,那么我们再启动一次uv_loop,这次试用uv_run(onces),这样他就只执行一次循环就退出了,这个方法是否可行 |
或者是在,callback执行以后,请求一个异步的关闭操作,在下个循环执行uv_stop |
void EventLoop2::stop(StopCallback callback)
}实际发现这样写,就能结束循环,并且能将 async_的uv句柄释放掉,只需要保证在uv_stop之前关闭掉其他句柄就可以了 |
计划10.1更。 |
v1.5.1 版本,增加eventloop退出机制,windows下测试无内存泄漏。例程:https://github.com/wlgq2/uv-cpp/tree/master/examples/loop_exit |
增加server退出机制。 |
最近看了很多EventLoop库,包括muduo,其实打多数库存在的问题是回调陷阱,就是回调发生期间,所依赖的对象已经被销毁的情况,导致段错误等问题,muduo这个问题会更加严重,uv-cpp至少能够在close的回调中delete掉对象,,muduo大部分情况下不知道在什么时候去销毁对象,可能在你刚销毁后,就遇到了捆绑此对象的回调,导致段错误。。 |
@x724172556 因为uv-cpp无法控制libuv不对一个析构对象的调用。接口最初设计成这样是为了向libuv妥协。后面看看有没有更好的办法。 |
将需要回调的对象(tcpclient)继承object,然后object会将自身注册进eventloop,析构的时候注销,回调的话,就可以判断对象的生命周期,存活就回调。。。这是传统c++面对对象的事件框架机制,我不知道你对这种方案是否认同 |
其实自己在对象外面包一层,析构里面Close,回调删对象,也不用手动调Close,直接删对象就行。参考HttpClient中删TcpClient。 |
@x724172556 问题是,回调是从libuv中触发,我无法把智能指针保存到libuv里面不被析构。还有一个问题,就算智能指针保证了C++的析构后的对象不被调用。但是不能维护libuv自己指针的生命周期,比如在libuv自己loop未结束时,智能指针删除了某个libuv的句柄。程序core。 |
给libuv的相关句柄在做一个 封装,这个封装不对外接口暴露,只是内部对象析构的调用这个句柄close,然后删句柄就行。有时间改改看。 |
对,我的其中一个想法就是,析构函数应该执行一次close,因为我不知道libuv的close设置为null还会不会依赖uv_handle,所以我让他在所有的libuv的回调中先判断对象是否存活 |
httpclient也是一个挺好的方法,把原来的tcpclient隐藏,作为一个内部类 |
唯一的问题可能就是,如果eventloop stop之后,再析构,可能会导致close回调不会调用,导致内存泄漏 |
你看runInLoop实现,如果当前loop是被停止的,是直接在调用线程中运行回调的。如果是loop没开始,则等待开始后在loop中回调。 |
那应该没有问题 |
我的解决思路如下所述,不过实际代码感觉很烂,需要的话可以提交 |
1.Sever及EventLoop退出机制。
2.UDP组播。
The text was updated successfully, but these errors were encountered: