- 主题:C++20的协程是劫持了系统调用?
碰到 IO 的时候切换到事件循环协程。所谓的切换就是汇编的 jmp 指令。
【 在 stub 的大作中提到: 】
: 那io怎么办
--
FROM 120.33.10.*
不是啊。。原本就有 nonblocking 版本。一般说来,为协和构建的 IO 库都会主动调用 nonblocking io. 不必搞啥劫持系统调用。协程并不减少 read/write 这些系统调用的次数。甚至还多了。
考虑 sleep(), lock(), unlock() 这些函数原本会陷入内核态中,但是在协程库里面,一般实现为带着参数 jmp 到事件循环协程就行了。没有任何系统调用。协程主要减少线程陷入内核态的时间,实现得好的话,能够提升一点 IO 性能。
但是也有一些协程库,通过 hook libc 的 read/write 等函数,将它改造成 nonblocking io 同时切换协程来无缝适配现有的代码。不过这种做法现在很少了。严格来说,他们 hook 的 libc,并不能 hook 系统调用。
【 在 stub 的大作中提到: 】
: 还是劫持了系统调用啊
--
FROM 120.33.10.*
libgo 那些就是 hook 存量的 app.
【 在 stub 的大作中提到: 】
: 还是太弱了啊,对存量lib没用
--
FROM 120.33.10.*
对的。c++ 的标准只是提供了协程的基本实现,居然要使用的话,得用上专门的协程库,包装好各种 IO 接口,比如文件、socket 和控制台的 IO.
【 在 wallyz 的大作中提到: 】
: 不是
: C++20并不提供具体的以协程方式实现的IO
: 某种意义上,我粗浅的不准确的理解是,C++20只是规定了协程的接口,
: ...................
--
FROM 120.33.10.*