- 主题:用协程不如用go和rust
c++20 里面会把 co_yield 转换成真正的调度代码啊。
转换成 c/asm 代码,co_yield 就是个 return 语句。也就是返回它的调用者。
而调用者用 co_await 切换到 generator 刚才退出的位置继续执行。
这就是最简单的纤程调度了啊。只有两个纤程,相互跳来跳去。
有了这个最简单的模型,再推广到更广泛的应用领域去。比如 c++20 的协程没说不能多线程。
【 在 ylh1969 的大作中提到: 】
: 还是没有解决异步IO的问题。
: 思考了一下,在C++协程里,co_yield没有出现context,不知道yield跑哪去了。
: 所以没办法调度。
: ...................
--
FROM 117.28.163.*
你思维一直没跳出来。。
你考虑一个问题啊。假如。你在是内核里面实现协程调度呢?
epoll() 这些都没有了。也没有 ucontext 帮我搞啥协程切换。
内核里面有大量的异步工作的。比如从磁盘读数据,使用 DMA 向网卡写数据,从键盘中断读数据。所以内核完全可以多多使用协程。
同时现代 CPU 又是多核的。所以这个协程还不能只跑在单核。。
那现在你要怎么样实现你的协程框架呢?
想明白了,恭喜!你已经会写操作系统内核了。
【 在 ylh1969 的大作中提到: 】
: 具体看一个调度实例:
: pthread_t tid=pthread_self();
: resource *rs=tpool.pool;
: ...................
--
修改:hgoldfish FROM 117.28.163.*
FROM 117.28.163.*
对啊。协程有时候和线程相比就是模糊不清的。
一个线程,在内核空间时碰到 IO 就主动 yield 的纤程,在用户空间时又是因为陷入内核态被调度器切换走的线程。
我们完全可以把 syscall 这条指令看成是纤程的 co_yield
这就是为啥我越来越觉得协程 coroutine 应该作为一种高层抽象,而不是具体的底层实现技术。具体的底层实现技术我觉得巨硬之前取的名字挺好的,就叫做 fiber,指代在一个线程里面切换的协程。
你实现的协程,是一种在多个线程之间切换的协程,应该叫做绿线程 green thread. 现在 java 改做 virtual thread 了。
【 在 ylh1969 的大作中提到: 】
: 内核调度,就是线程/进程呀,你说的所有异步过程发生在内核,在IO时,肯定会锁死线程/进程,但是别的线程/进程不受影响,在用户态,看起来就是同步IO。
: 在所有的例子里,协程就是语法糖,就如你说的,性能另说,它不是关键的,必不可少的技术方法。
: 如果把协程的context封装了,那跟线程又有什么区别呢?你的那些例子用多线程干可能更好。
: ...................
--
修改:hgoldfish FROM 117.28.163.*
FROM 117.28.163.*
广义上的 web 后端和游戏开发也是 UI
注意我这里提的是 UI,不是 GUI
像 c++ 就不能说是 UI 语言,因为它可以拿来搞算法和系统编程。不需要考虑用户交互。
【 在 zerg136 的大作中提到: 】
: c#是搞gui的?不对吧
: 现在c#做企业后台开发,和做游戏开发都有用啊
--
FROM 27.152.110.*