【问题标题】:Using EVLOOP_NONBLOCK in libevent在 libevent 中使用 EVLOOP_NONBLOCK
【发布时间】:2013-03-12 09:20:44
【问题描述】:

libevent 我添加了以下代码:

while (run) {
  event_base_loop(base, EVLOOP_NONBLOCK | EVLOOP_ONCE);
}

如果我将其与以下内容进行比较:

event_base_dispatch(base);

这两个语句是否相等?

【问题讨论】:

  • 你的意思是这些陈述是否相等?
  • 出于某种原因我想将event_base_dispatch(base) 更改为event_base_loop(base, EVLOOP_NONBLOCK | EVLOOP_ONCE),但我无法评估风险。

标签: c++ libevent


【解决方案1】:

不,event_base_dispatch(base) 调用等价于event_base_loop(base, 0),这意味着它既不会在第一批事件之后停止(就像event_base_loopEVLOOP_ONCE 一样)也不会在没有事件准备好的情况下立即返回(就像event_base_loopEVLOOP_NONBLOCK 一样)。

您可能想阅读 Nick Mathewson 撰写的关于 libevent 的好书:http://www.wangafu.net/~nickm/libevent-book/Ref3_eventloop.html

【讨论】:

  • 谢谢雷米。我想在事件循环中做点什么,所以我尝试使用while (run) event_base_loop(base, EVLOOP_NONBLOCK | EVLOOP_ONCE) 而不是event_base_dispatch(base)。这是否存在效率问题或其他风险?
  • 在 event_base_loop(base, EVLOOP_NONBLOCK | EVLOOP_ONCE) 上循环比简单地执行 event_base_dispatch() 效率稍低。我能问一下你想做什么吗?您是否尝试过使用计时器事件或使用 event_base_loopbreak() ?
  • 我有一个网络线程和一个用户线程,网络线程调用event_base_loop进行事件循环(详情:while(run) { event_loop; MyUpdate(); })。我尝试在用户线程中调用函数bufferevent_socket_connect,但它不起作用(不是线程安全的?)。所以,我这样做:用户线程:将连接请求推送到请求缓冲区;网络线程: 1. 在请求缓冲区上循环 2. 获取连接请求 3. 调用 buffervent_socket_connect 进行连接。
  • 我不明白你为什么需要跳出循环?关于 libevent 和线程,请参阅wangafu.net/~nickm/libevent-book/…
  • 根据我的经验,Libevent 实际上并不是线程安全的。某些 API 在多线程环境中无法正常工作。最糟糕的是,从另一个线程调用bufferevent_free 会死锁(link)。所以我尝试在网络线程中调用bufferevent API,用户线程只是向直接调用bufferevent API的网络线程发送一些请求。我需要跳出循环,处理用户线程请求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多