首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么C++的异步/等待不需要事件循环?

为什么C++的异步/等待不需要事件循环?
EN

Stack Overflow用户
提问于 2021-02-20 00:26:14
回答 4查看 3.3K关注 0票数 19

对于对其他语言(Python/JavaScript)有一定异步经验的人来说,当谈论异步/等待时,总是会假设在某个地方有一个事件循环。但是对于C++,我已经浏览了文档,没有找到任何讨论事件循环的地方。为什么会这样呢?

对于Node,它只有一个默认的事件循环。对于Python,如果需要,您可以创建多个。但是对于C++,这个事件循环是不是和Node一样呢?或者出于某种原因,我们根本不需要它吗?

EN

Stack Overflow用户

发布于 2021-02-20 04:22:39

C++中没有事件循环,线程与协程的关系也很小。

当您在C++中执行co_await时,函数的执行被挂起,代码继续执行调用者,就像函数已经返回一样。实际上,它是这样实现的。co_await将更改协程的内部状态机并返回。

当代码显式恢复函数时,将恢复执行。

这就是协作多任务处理。对执行的控制是显式的和可预测的。

现在,使用大多数库,您不必回调要恢复的协程。这就是执行者的用武之地。它们有点像事件循环,但在库中,而不是在语言中烘焙。用户代码也可以实现它们,您可以针对不同的用例使用不同的代码。它们通常会调度协程的执行,也可以管理多个线程来一次执行其中的许多线程。

例如,您可以完全在线程池的顶部实现一个executor。等待io的大型操作不需要为自己阻塞线程,它将启动io操作并将线程返回给其他任务。在内部,io操作将把协程调度回线程池中进行恢复。

另一个例子是linux上的io_uring,它是新的async io api。您可以使用executor包装工具,并将io操作作为协程运行。从技术上讲,你不需要线程来做这件事。对co_await的调用将简单地调度io操作,一旦内核将结果入队,协程将恢复。

票数 4
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66281348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档