• _wang
    2023-04-06 来自陕西
    老师,上一个问题可以忽略了,其实是我看岔了,这里是对的,最后返回的都是Awaitable,感谢老师的精彩讲解。

    作者回复: :thumbup

    
    
  • 猪小擎
    2023-03-30 来自北京
    老师的github代码有好多GBK文件,建议修改下。 携程的本质优点减少上下文切换,(中断),中断操作系统会把寄存器存在栈顶,然后内核栈和用户栈互换,这些大概会消耗1-10微秒。携程就要节约这无数的1-10微秒。可以操作系统的IO操作是默认会中断的,要把中断改成yield出让执行权需要做什么呢?底层调用的filesystem的操作本身就是中断操作吧?上层改成携程,对于进程来说,这中断的消耗并没有节省。

    作者回复: 感谢反馈,源代码正在做更新。 这里我们协程是一个简单的“示例性”封装,实际要通过协程处理I/O肯定要以IOCP、epoll和kqueue等技术为基础,并利用协程作为接口封装,在避免多线程与锁的情况下实现任务上下文切换,而不是直接使用filesystem这种简单的同步I/O接口,但是如果这样就会偏离我们想要讲解的重点,所以就使用filesystem做了简单的示例。

    共 2 条评论
    
  • peter
    2023-02-07 来自北京
    请教老师两个问题: 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的协程框架确实并不容易,但是基于框架再做业务开发就会简单很多。

    
    
  • _wang
    2023-04-06 来自陕西
    不知道是不是我看岔了, ioAsyncity函数返回的类型是asyncify, 而这个asyncify并没有定义为一个Awaitable,那么是如何co_await的?反倒asyncify函数返回的类型是Awaitable这个是可以被co_await的。
    
    