协程切换分为三步:1. 保存当前协程的寄存器 2. longjmp 3. 恢复目标协程的寄存器
longjmp 只是其中一步,所以不能简单地用于实现协程。
swapcontext() 是 unix 通用(但android不实现),但问题是会陷入内核,效率不高。SwitchToFiber() 不清楚,Windows 接近微内核,估计 SwitchToFiber() 不会陷入内核。
实现协程确实很简单,那个 PDF 没骗你。难的是协程怎么样跟事件循环结合,打造出真正有用的网络库。我看网上很多协程库,压根不考虑抛出异常怎么处理,也不去实现 kill() 协程的功能。
【 在 billybear04 (billybear04) 的大作中提到: 】
: 标 题: Re: 协程或线程库好写吗?
: 发信站: 水木社区 (Wed Jun 10 06:39:56 2020), 站内
:
: 【 在 allegro (静水流深) 的大作中提到: 】
: : 我记得longjmp无法完整的模拟coroutine。
: : 你可以往回跳但不能往前跳。
: 我不知道。那个PDF我是跳着看的。然后看到BLOG里setcontext, Windows下用fiber,就不想再学了。
:
: 为避免误会,so/very simple是pdf里作者的原话,不是我的想法。因为觉得exception难以实现,一开始我就没觉得simple。这种功能我觉得是语言设计者的保留地。以前在DOS下有个FloodFill的程序,自己用汇编切换了堆栈,那得上汇编啊。
: --
: 谁能想到一头整天游手好闲的青年绿龙,竟然会沉溺于阅读,他几乎什么都看,无论是诙谐的小说还是慷慨激昂的史诗,连晦涩的宗教典籍都能耐着性子看下去。在起居室内,甚至有一张斜面桌供绿龙阅读时使用。...要破解密码盘,不仅要足够的实力来到这,还要熟悉矮人风俗、矮人宗教学和矮人史。而矮人们肯定不会闯入祖先的祭坛,那熟知以上知识的外族人去哪找?斯坦德路此时简直想放声大笑,过往积累的知识,阅读书籍受到的嘲笑,终于有了报偿!
:
:
: ※ 来源:·水木社区
http://newsmth.net·[FROM: 106.121.160.*]
--
FROM 112.47.122.*