10|Coroutines实战(二):异步文件操作库
I/O 调度模块
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了如何使用协程实现异步文件操作库,并探讨了实现所有调度线程全异步化的理想异步模型。文章首先介绍了基于协程调度的异步文件系统操作库的实现思路,包括创建独立的I/O任务队列和使用新线程处理I/O任务。接着,详细介绍了task分区、loop分区和asyncify分区的具体实现,展示了如何实现异步I/O的处理流程。通过对代码的解析,读者可以了解如何使用协程实现异步I/O任务处理的细节,以及如何将普通函数转换成支持在协程中异步执行的函数。此外,文章还简要介绍了文件系统操作模块的封装方法,展示了如何使用ioAsyncify将普通函数转换成异步任务函数。整体而言,本文通过具体的代码实现和解析,帮助读者快速了解了使用协程实现异步文件操作库的技术特点。文章还深入讨论了C++ Coroutines的概念,包括协程调度的细节和实现约定,为读者提供了更深入的理解。最后,文章指出了C++ Coroutines的潜力和未来发展前景,展望了在未来C++标准中对协程的更加成熟的支持。
《现代 C++20 实战高手课》,新⼈⾸单¥59
全部留言(2)
- 最新
- 精选
- 猪小擎老师的github代码有好多GBK文件,建议修改下。 携程的本质优点减少上下文切换,(中断),中断操作系统会把寄存器存在栈顶,然后内核栈和用户栈互换,这些大概会消耗1-10微秒。携程就要节约这无数的1-10微秒。可以操作系统的IO操作是默认会中断的,要把中断改成yield出让执行权需要做什么呢?底层调用的filesystem的操作本身就是中断操作吧?上层改成携程,对于进程来说,这中断的消耗并没有节省。
作者回复: 感谢反馈,源代码正在做更新。 这里我们协程是一个简单的“示例性”封装,实际要通过协程处理I/O肯定要以IOCP、epoll和kqueue等技术为基础,并利用协程作为接口封装,在避免多线程与锁的情况下实现任务上下文切换,而不是直接使用filesystem这种简单的同步I/O接口,但是如果这样就会偏离我们想要讲解的重点,所以就使用filesystem做了简单的示例。
2023-03-30归属地:北京21 - peter请教老师两个问题: Q1:asyncF与testVoid定义为什么不同? asyncF与testVoid都是协程,但testVoid的定义是:asyncpp::task::Coroutine testVoid();而testVoid的定义是Coroutine asyncF()。函数前面部分不同,为什么? Q2:协程在C++语法层面的支持就是几个关键字吗? 这两篇读下来,有点模模糊糊,总体上感觉在C++语法层面,对于协程,似乎就是Coroutine、co_await这两个关键字,是吗?(Awaitable 和 Awaiter需要自己实现,不算关键字吧)
作者回复: Q1: 代码前面已经using asyncpp::task::Coroutine,所以这里asyncpp::task::Coroutine和Coroutine是一样的,这里只是演示引用该类型的不同用法,没有其他不同。 Q2:C++的协程提供了: (1)关键字:协程只提供了co_await、co_yield这两个关键字。 (2)基础类型支持:coroutine_handle是C++协程标准库内提供的类型 (3)协程协议框架:其他部分只定义了一个协议框架,包括Coroutine、Promise、Awaitable和Awaiter都是标准提出的概念,并且定义了相关的标准协议,但是并没有提供标准实现或者工具,需要开发者熟悉这些协议然后自己实现。 所以说,就目前来说(在C++26或后续标准到来以前)实现一个C++20的协程框架确实并不容易,但是基于框架再做业务开发就会简单很多。
2023-02-07归属地:北京