libco icon indicating copy to clipboard operation
libco copied to clipboard

协程的调用链如何切换到主协程?

Open xywanz opened this issue 5 years ago • 2 comments

  1. 如果在一个协程里启动了另外一个协程或者一系列的协程调用链,在最后其中一个协程调用链的最后一个节点里调用了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(); }

  1. 主协程开启了多个协程,如果从子协程切换回了主协程的事件循环,那么主协程会先调度所有可调度的协程,直到所有子协程都进入了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(); }

xywanz avatar Apr 15 '19 05:04 xywanz

还有一个问题就是,我看到1个线程只有1个call stack,那么如果有多个调用链会怎么样? main_co -> co_list1_1 -> co_list1_2 -> ... main_co -> co_list2_1 -> co_list2_2 -> ...

xywanz avatar Apr 15 '19 05:04 xywanz

  1. 如果co_func1调用了会触发协程切换的函数,那最终是会回到main协程的;main协程会会执行co_eventloop里面的回调函数;

  2. 子协程与主协程是在同一个线程内的,所以主协程会等到所有子协程让出之后才继续执行事件循环。

  3. 一个线程下只能执行一条调用链

leiffyli avatar Apr 15 '19 06:04 leiffyli