无法加入ev循环线程,因为它挂在epoll_wait()

时间:2013-04-11 17:55:39

标签: asynchronous redis epoll libev hiredis

我正在使用与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();
    }
}

1 个答案:

答案 0 :(得分:4)

很难回答,因为你只提供了4行代码,但在我看来你把ev_unloop称为事件循环,这几乎没用。

在这里,你调用ev_unloop然后尝试加入线程,所以我的理解是你在主线程中,想要通知事件循环停止,并等待事件循环线程停止。 IMO正确的方法是:

  • 将ev_async处理程序添加到事件循环中。

  • 与此异步处理程序关联的回调应调用ev_unloop - 它将从事件循环内的事件循环线程执行。

  • 在你的主线程中通知事件循环的ev_async处理程序(线程安全操作),然后你可以加入事件循环线程

这通常是我使用ev_unloop的方式。