我正在使用与freev的异步hiredis。 mLoopThread在这里用于ev循环线程,基本上mLoopThread正在调用ev_loop()。当主线程试图破坏异步hiredis实例时,它调用ev_unloop尝试使ev_loop()退出。代码如下所示。但这不起作用。 backtrace显示mLoopThread挂在epoll_wait()中,主线程挂在mLoopThread-> join()中。如何退出ev循环线程?感谢。
~async_redis() {
ev_unloop(mLoop, EVBREAK_ALL);
if (mLoopThread && mLoopThread->joinable()) {
mLoopThread->join();
}
}
答案 0 :(得分:4)
很难回答,因为你只提供了4行代码,但在我看来你把ev_unloop称为事件循环,这几乎没用。
在这里,你调用ev_unloop然后尝试加入线程,所以我的理解是你在主线程中,想要通知事件循环停止,并等待事件循环线程停止。 IMO正确的方法是:
将ev_async处理程序添加到事件循环中。
与此异步处理程序关联的回调应调用ev_unloop - 它将从事件循环内的事件循环线程执行。
在你的主线程中通知事件循环的ev_async处理程序(线程安全操作),然后你可以加入事件循环线程
这通常是我使用ev_unloop的方式。