从另一个线程中断 event_base_dispatch
Posted
技术标签:
【中文标题】从另一个线程中断 event_base_dispatch【英文标题】:Break event_base_dispatch from another thread 【发布时间】:2014-09-16 07:42:19 【问题描述】:我可以将在另一个线程中运行的event_base_loopbreak
调用到int event_base_dispatch(struct event_base *base)
吗?
【问题讨论】:
添加大约 2~3 行上下文使得人们更有可能回答您的问题 - 这真的简洁。 【参考方案1】:可以使用来自另一个线程的event_base_loopbreak
来停止event_base_dispatch
。只需在创建event_base
之前调用evthread_use_pthreads
或evthread_use_windows_threads
即可启用多线程支持。
【讨论】:
我遇到了这个问题,即在另一个线程中与 EVLOOP_NO_EXIT_ON_EMPTY 一起使用的 event_base_loop 没有执行在主线程中创建的事件。一旦我将 evthread_use_pthreads 放在 event_base 创建之前,它就起作用了。非常感谢队友【参考方案2】:从事件循环外部调用 event_base_loopbreak 实际上没有效果,在循环内部,event_base_loopbreak 不会从循环中中断。所以,调用 event_base_loopbreak 到 int event_base_dispatch(struct event_base *base) 在另一个线程中运行,应该没有任何效果。
【讨论】:
那么,如何从另一个线程停止 event_base_dispatch?或者我可以在 event_base_dispatch 工作时向 event_base 添加事件吗?【参考方案3】:我也遇到了同样的问题,无论从其他线程调用 event_base_loopbreak() 还是 event_add() 都不起作用。
参考How to break out libevent's dispatch loop,我必须在启动事件循环之前设置一个计时器事件,并轮询退出标志以从事件回调中调用 event_base_loopbreak(),这样才能成功退出事件循环
【讨论】:
以上是关于从另一个线程中断 event_base_dispatch的主要内容,如果未能解决你的问题,请参考以下文章