我正在使用libevent库进行网络服务开发。其中一个事件循环不仅处理网络 I/O 事件,还轮询消息队列。我想在该线程空闲时阻塞并等待(意味着没有 I/O 事件并且队列为空)。
我能想到的唯一方法就是把等待队列非空的操作当作一个事件,这样我就可以同时等待I/O事件和队列。
但是,
event_new
函数需要我传递一个回调函数,而我不需要回调函数做任何事情;我只是希望线程在等待事件发生后恢复操作。
我查看了 libevent 文档,但找不到任何可以解决我的问题的 API。
我应该做什么?还是这个逻辑不符合libevent的开发准则?
这是错误的问题:
如何在libevent中注册不需要回调函数的事件
当然您的事件需要回调函数,因为每个 libevent 事件都需要。 这就是 libevent 通知应用程序事件已发生的方式,以便应用程序可以(可选)对此执行某些操作。
至少,您可以将其修改为“不需要回调执行任何操作的事件”。 这已经为您提供了一个潜在的方向,因为不执行任何操作的回调非常容易编写。 但这真的是您所需要的吗? 不,当然不是。 您确实希望您的程序采取行动:阻止或解除阻止(我不清楚是哪一个)。
型号错误 你说你愿意
,但那是无稽之谈。等待操作
不是事件。 它可能是当事件发生时所做的事情,但事件是“某事发生”。 新数据到达。 文件描述符准备就绪。 对手出现了。 在您的情况下,您可以将队列清空视为一个事件,但
是一种行为,而不是事件。 但是,等待并不是您希望回调执行的操作,因为它将阻止事件循环在等待结束之前调度更多事件。 避免此类等待是 libevent 的首要目标之一。 解决了问题
你说:
这是 libevent,我将你的“事件循环”视为一个调用或者可能是
event_base_dispatch()
event_base_loop()
的线程。 我认为您要解决的问题是事件调度函数在没有待处理或活动事件时返回,因为如果它只是等待其他事件到达那么就可以解决问题(对吗?)。
但您肯定不认为这是一个不寻常的要求。 事实并非如此,libevent 已经涵盖了它。 这就是EVLOOP_NO_EXIT_ON_EMPTY
标志 的用途。 您可以通过创建一个 event_config
对象、在其上设置标志并使用它来配置适当的事件库来使用它。 像这样的东西:
struct event_config *config = event_config_new();
event_config_set_flag(config, EVLOOP_NO_EXIT_ON_EMPTY);
struct event_base *events = event_base_new_with_config(config);
这只是一个例子。 您必须已经在做一些相关的事情,并且需要确定将附加调度循环标志集成到代码中的适当方法。