3

我正在将异步hiredis与libev一起使用。mLoopThread 在这里用于 ev 循环线程,基本上 mLoopThread 正在调用 ev_loop()。当主线程试图破坏异步hiredis实例时,它调用ev_unloop试图让ev_loop()退出。代码如下所示。但这不起作用。回溯显示 mLoopThread 在 epoll_wait() 中挂起,主线程在 mLoopThread->join() 中挂起。如何退出ev循环线程?谢谢。

~async_redis() {
    ev_unloop(mLoop, EVBREAK_ALL);
    if (mLoopThread && mLoopThread->joinable()) {
        mLoopThread->join();
    }
}
4

1 回答 1

4

很难回答,因为您只提供了 4 行代码,但在我看来,您将 ev_unloop 从事件循环中调用,这几乎没用。

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

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

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

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

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

于 2013-04-12T15:55:46.803 回答