协程 coobjc 源码分析:co 调度
2023-11-26 19:45:04
协程coobjc中的co调度是实现协程协作的关键。协程,又称微线程,是一种轻量级线程,可以将一个任务分解成多个子任务,每个子任务在一个独立的协程中执行,协程之间通过调度器来协作。在coobjc中,co调度是通过coroutine和scheduler这两个数据结构来实现的。
coroutine 数据结构
struct coroutine {
...
coroutine_entry entry;
...
};
在协程的数据结构中,和调度相关的字段是 entry,它是需要执行的任务,最终指向的是 co_func 函数指针。
scheduler 数据结构
struct scheduler {
...
coroutine *current;
...
};
调度器的数据结构中,和调度相关的字段是 current,它是当前正在执行的协程。
co_launch 函数
co_launch 函数是启动协程的入口函数,它会创建一个新的协程,并将其加入到调度器中。
coroutine *co_launch(coroutine_entry func, ...) {
...
coroutine *co = co_create(func, ...);
...
co_schedule(co);
...
}
在 co_launch 函数中,首先会创建一个新的协程,然后将这个协程加入到调度器中,最后调用 co_schedule 函数来调度协程。
co_schedule 函数
co_schedule 函数是调度协程的核心函数,它会选择一个协程来执行,并将当前正在执行的协程挂起。
void co_schedule(coroutine *co) {
...
scheduler *s = co_get_scheduler();
...
s->current = co;
...
}
在 co_schedule 函数中,首先会获取当前的调度器,然后将当前正在执行的协程挂起,最后将要执行的协程设置为当前协程。
co_yield 函数
co_yield 函数是协程让出控制权的函数,它会将当前正在执行的协程挂起,并选择另一个协程来执行。
void co_yield(void) {
...
scheduler *s = co_get_scheduler();
...
s->current = NULL;
...
}
在 co_yield 函数中,首先会获取当前的调度器,然后将当前正在执行的协程挂起,最后将当前协程设置为 NULL。
协程调度过程
协程的调度过程可以总结如下:
- 创建一个新的协程。
- 将这个协程加入到调度器中。
- 调用 co_schedule 函数来调度协程。
- co_schedule 函数会选择一个协程来执行,并将当前正在执行的协程挂起。
- 被选中的协程会执行,直到它调用 co_yield 函数让出控制权。
- co_yield 函数会将当前正在执行的协程挂起,并选择另一个协程来执行。
- 重复步骤 4 到 6,直到所有协程都执行完成。
总结
协程coobjc中的co调度是通过coroutine和scheduler这两个数据结构来实现的。co_launch函数是启动协程的入口函数,它会创建一个新的协程,并将其加入到调度器中。co_schedule函数是调度协程的核心函数,它会选择一个协程来执行,并将当前正在执行的协程挂起。co_yield函数是协程让出控制权的函数,它会将当前正在执行的协程挂起,并选择另一个协程来执行。
希望这篇文章能够帮助你理解协程coobjc中的co调度。