返回

协程 coobjc 源码分析:co 调度

IOS

协程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。

协程调度过程

协程的调度过程可以总结如下:

  1. 创建一个新的协程。
  2. 将这个协程加入到调度器中。
  3. 调用 co_schedule 函数来调度协程。
  4. co_schedule 函数会选择一个协程来执行,并将当前正在执行的协程挂起。
  5. 被选中的协程会执行,直到它调用 co_yield 函数让出控制权。
  6. co_yield 函数会将当前正在执行的协程挂起,并选择另一个协程来执行。
  7. 重复步骤 4 到 6,直到所有协程都执行完成。

总结

协程coobjc中的co调度是通过coroutine和scheduler这两个数据结构来实现的。co_launch函数是启动协程的入口函数,它会创建一个新的协程,并将其加入到调度器中。co_schedule函数是调度协程的核心函数,它会选择一个协程来执行,并将当前正在执行的协程挂起。co_yield函数是协程让出控制权的函数,它会将当前正在执行的协程挂起,并选择另一个协程来执行。

希望这篇文章能够帮助你理解协程coobjc中的co调度。