libco
libco copied to clipboard
协程的调用链如何切换到主协程?
- 如果在一个协程里启动了另外一个协程或者一系列的协程调用链,在最后其中一个协程调用链的最后一个节点里调用了read等经过异步改造的系统调用之后,协程会切换回主协程吗? void *co_func2(void *args) { read(...); ... } void *co_func1(void *args) { co_create(&co2, NULL, co_func2, NULL); co_resume(co2); ... }
int main() { co_create(&co1, NULL, co_func1, NULL); co_resume(co1); co_event_loop(); }
- 主协程开启了多个协程,如果从子协程切换回了主协程的事件循环,那么主协程会先调度所有可调度的协程,直到所有子协程都进入了read之类的等待事件,主协程才会掉用epoll把自己阻塞吗? void *co_func(void *args) { read(...); ... }
int main() { co_create(&co1, NULL, co_func, NULL); co_create(&co2, NULL, co_func, NULL); co_resume(co1); co_resume(co2); co_event_loop(); }
还有一个问题就是,我看到1个线程只有1个call stack,那么如果有多个调用链会怎么样? main_co -> co_list1_1 -> co_list1_2 -> ... main_co -> co_list2_1 -> co_list2_2 -> ...
-
如果co_func1调用了会触发协程切换的函数,那最终是会回到main协程的;main协程会会执行co_eventloop里面的回调函数;
-
子协程与主协程是在同一个线程内的,所以主协程会等到所有子协程让出之后才继续执行事件循环。
-
一个线程下只能执行一条调用链