gpt4 book ai didi

c++ - C/C++ 中的事件循环实现在调用堆栈上非常好

转载 作者:行者123 更新时间:2023-11-30 18:53:11 24 4
gpt4 key购买 nike

TL;DR

在 C/C++ 中,能够很好地管理调用堆栈的事件循环的最佳实现是什么?

  • 为什么?
  • 基准/比较?
  • 文献/出版物/文档?

事件循环,问题

它们是一个简单的概念:WAITING事件、处理事件、等待更多事件。

我回顾了一些旧项目,发现了一个简单(而且有点差)的搜索引擎实现,我对执行事件循环的正确方式产生了好奇心。 p>

当时我做了这样的(非常)简化的示例:

int wait_for_query();
int handle_query();

int main(int argc, const char** argv) {
return wait_for_query();
}

int wait_for_query() {
// Do some stuff
return handle_query();
}

int handle_query() {
// Handle it
// if query is quit, return quit();
return wait_for_query();
}

int quit() {
return 0;
}

此实现依赖于调用链来实现“事件循环”。我使用引号是因为虽然它在逻辑上是一个事件循环,但调用堆栈不断增加并且永远不会展开:

                                            wait_for_query____...
/
handle_query_______/
/
wait_for_query_______/

当它工作时,它总是向堆栈添加新的堆栈帧,最终,在足够多的事件之后,它将导致堆栈溢出错误! (哈哈,所以元)。

我想要的是这样的:

                       handle_query           handle_query
/ \ / \
wait_for_query_______/ \_______/ \_____...

到目前为止我所得到的

我一直听说操作系统只是一个被中断的 while(true) 循环,所以(因为我的操作系统最近没有收到 SO 错误)这就是我的想法好:

  • 将 main 替换为:

    while(1)
    if (wait_for_query() == 0) break;
    return 0;
  • handle_query 的返回值更改为 1

但这实际上会提高堆栈效率吗?据我所知, while 循环(以及一般的循环)仍然会产生汇编语言中的堆栈帧(因为它们都是带有作用域/局部变量/等的执行分支)

C/C++ 中事件循环的最佳实现是什么,可以很好地管理调用堆栈

  • 为什么?
  • 基准/比较?
  • 文献/出版物/文档?

注释

这个问题假设一个单线程事件循环。并行答案也是可以接受的,但我认为一次性询问所有问题有点太多了;)

开火

最佳答案

最初的解决方案从根本上被破坏了Event loop看起来像这样:

while (q != QUITE) {
q = wait_for_query();
handle_query(q);
}

就这么简单。这实际上与您所描述的一致:

They're an easy concept: Wait for an event, handle event, wait for more events.

在初始代码中,从语义上讲,处理事件 handle_query() 永远不会完成,直到所有 future 事件也递归完成,这意味着没有事件将永远完成。这不是你想要的。

细节可能会变得非常复杂,例如如何获取事件?它是否阻塞?事件是如何调度的? ...等等

关于c++ - C/C++ 中的事件循环实现在调用堆栈上非常好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33324288/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com