【发布时间】:2021-08-29 11:27:59
【问题描述】:
延迟回调
默认情况下,bufferevent 回调会在 相应的情况发生。 (这对于 evbuffer 回调是正确的 也;我们稍后会谈到这些。)这种立即调用可以使 当依赖关系变得复杂时会遇到麻烦。例如,假设有 是一个回调,当数据变空时将数据移动到 evbuffer A 中,并且 另一个在 evbuffer A 增长时处理数据的回调 满的。 由于这些调用都发生在堆栈上,您可能会冒险 如果依赖关系变得足够糟糕,则会发生堆栈溢出。
要解决这个问题,您可以告诉 bufferevent(或 evbuffer)它的 回调应该被推迟。当满足条件时 延迟回调,而不是立即调用它,而是排队 作为 event_loop() 调用的一部分,在常规调用之后调用 事件的回调。
如上所述:
- 事件循环获取一批事件,并立即一个一个地处理它们。
- 在处理提取的事件之前,不会提取和处理任何新事件。
- 如果一个事件被标记为
BEV_OPT_DEFER_CALLBACKS,那么它将在处理完同一批次中的所有其他事件后处理。
提供了两个回调ca 和cb。首先调用ca,ca发现evbuffer_A为空,然后往里面写入消息。
然后,cb 被调用,cb 发现 evbuffer_A 包含一条消息,然后取出并发送出去。
当cb 被调用时,ca 的堆栈已经被释放。我认为在这种情况下不会出现堆栈溢出。
所以,我的问题是:
libevent 中延迟回调的目的是什么?
【问题讨论】:
-
发布的文字中解释了目的...您能否更具体地说明您的问题
标签: c linux networking network-programming libevent