缩短 ASIO 协程调度时间

boost asio coroutine scheduling time

提问人:qing zhao 提问时间:8/1/2023 最后编辑:seheqing zhao 更新时间:8/2/2023 访问量:26

问:

asio 是否像 golang 的协程 (G) 仍然运行在工作线程 (M) 之上,但在语言的调度器的帮助下,协程只需要在用户模式下切换,工作线程并不知道协程的存在。那么哪个线程负责协程的执行,这种关系是如何确定的呢?

C++ 异步 Boost Boost-ASIO

评论

0赞 sehe 8/2/2023
我很乐意为您引用文档,但我想提醒您,通过在 stackoverflow 上提问来学习 Asio 并不是最有效的方法。相反,选择一个目标,实现它(通过使用文档示例和库示例。然后,如果问题尚未得到解答,请在此处提问!

答:

0赞 sehe 8/2/2023 #1

您可以决定哪些线程可能运行异步操作(启动函数或处理程序)。

文档在这里:无线程并发

库的要求和保证记录在这里:线程。值得注意的摘录:

此库针对特定平台的实现可能会使用一个或多个内部线程来模拟异步性。这些线程必须尽可能对库用户不可见。具体而言,线程:

  • 不得直接调用用户的代码;和
  • 必须阻止所有信号。

这种方法由以下保证补充:

  • 异步完成处理程序将仅从当前调用 io_context::run() 的线程调用。

因此,库用户有责任创建和管理将向其传递通知的所有线程。

采用这种方法的原因包括:

  • 通过仅从单个线程调用 io_context::run(),用户的代码可以避免与同步相关的开发复杂性。例如,库用户可以实现单线程的可伸缩服务器(从用户的角度来看)。
  • 库用户可能需要在线程启动后不久和执行任何其他应用程序代码之前在线程中执行初始化。例如,Microsoft COM 的用户必须先调用 CoInitializeEx,然后才能从该线程调用任何其他 COM 操作。
  • 库接口与用于线程创建和管理的接口分离,并允许在线程不可用的平台上实现。