本文共 1973 字,大约阅读时间需要 6 分钟。
问题:协程的内部原语操作有哪些?分别如何实现的?
协程的核心原语操作:create, resume, yield。协程的原语操作有create怎么没有exit?以NtyCo为例,协程一旦创建就不能有用户自己销毁,必须得以子过程执行结束,就会自动销毁协程的上下文数据。以_exec执行入口函数返回而销毁协程的上下文与相关信息。co->func(co->arg) 是子过程,若用户需要长久运行协程,就必须要在func函数里面写入循环等操作。所以NtyCo里面没有实现exit的原语操作。create:创建一个协程
实现代码如下:
int nty_coroutine_create(nty_coroutine **new_co, proc_coroutine func, void *arg) { assert(pthread_once(&sched_key_once, nty_coroutine_sched_key_creator) == 0); nty_schedule *sched = nty_coroutine_get_sched(); if (sched == NULL) { nty_schedule_create(0); sched = nty_coroutine_get_sched(); if (sched == NULL) { printf("Failed to create scheduler\n"); return -1; } } nty_coroutine *co = calloc(1, sizeof(nty_coroutine)); if (co == NULL) { printf("Failed to allocate memory for new coroutine\n"); return -2; } // int ret = posix_memalign(&co->stack, getpagesize(), sched->stack_size); if (ret) { printf("Failed to allocate stack for new coroutine\n"); free(co); return -3; } co->sched = sched; co->stack_size = sched->stack_size; co->status = BIT(NTY_COROUTINE_STATUS_NEW); // co->id = sched->spawned_coroutines ++;co->func = func; co->fd = -1;co->events = 0; co->arg = arg; co->birth = nty_coroutine_usec_now(); *new_co = co; TAILQ_INSERT_TAIL(&co->sched->ready, co, ready_next); return 0;}
yield:让出CPU
void nty_coroutine_yield(nty_coroutine *co)
参数:当前运行的协程实例
调用后该函数不会立即返回,而是切换到最近执行resume的上下文。该函数返回是在执行resume的时候,会有调度器统一选择resume的,然后再次调用yield的。resume与yield是两个可逆过程的原子操作。resume:恢复协程的运行权
int nty_coroutine_resume(nty_coroutine *co)
参数:需要恢复运行的协程实例
调用后该函数也不会立即返回,而是切换到运行协程实例的yield的位置。返回是在等协程相应事务处理完成后,主动yield会返回到resume的地方。email:
email: email: 协程技术交流群:829348971转载地址:http://lpfqj.baihongyu.com/