博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux高性能网络:协程系列05-协程实现之原语操作
阅读量:3512 次
发布时间:2019-05-20

本文共 1973 字,大约阅读时间需要 6 分钟。

目录

5.协程的实现之原语操作

  问题:协程的内部原语操作有哪些?分别如何实现的?

  协程的核心原语操作:create, resume, yield。协程的原语操作有create怎么没有exit?以NtyCo为例,协程一旦创建就不能有用户自己销毁,必须得以子过程执行结束,就会自动销毁协程的上下文数据。以_exec执行入口函数返回而销毁协程的上下文与相关信息。co->func(co->arg) 是子过程,若用户需要长久运行协程,就必须要在func函数里面写入循环等操作。所以NtyCo里面没有实现exit的原语操作。

create:创建一个协程

  1. 调度器是否存在,不存在也创建。调度器作为全局的单例。将调度器的实例存储在线程的私有空间pthread_setspecific。
  2. 分配一个coroutine的内存空间,分别设置coroutine的数据项,栈空间,栈大小,初始状态,创建时间,子过程回调函数,子过程的调用参数。
  3. 将新分配协程添加到就绪队列 ready_queue中。

  实现代码如下:

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/

你可能感兴趣的文章
Java标准库定义的常用异常,自定义异常 2020-2-15
查看>>
Java问题百度/Google记录 2020-2-16
查看>>
【PADS9.5】9,对比ECO核心板,Router移动元件后布线消失,Router找不到自动布线策略文件丢失或损坏
查看>>
【STM32+w5500汇总】23,HTTP_Client 连接到ONENET上传了一段数据之后会断开,数据上传格式的设置
查看>>
【STM32+W5500+MQTT】24,所有功能都可以通过API函数的调用来实现;HTTP接入ONENET,API开发手册和打包函数,串口软件HTTP连接服务器上传数据,2018年12月28日
查看>>
【STM32+W5500+HTTPClient】25,路由器DHCP租赁IP时间为2h,NetBios可以很好的解决IP变化的问题,DNS,2018年12月25日
查看>>
【STM32+MQTT+ONENET】26,MQTT协议接入OneNET
查看>>
【STM32+W5500+MQTT+ONENET】27,MQTT协议接入OneNET实际编程操作 2018年12月27日
查看>>
【STM32Cube+FreeRTOS 】28,KEIL5的F12不起作用;***JLink Error: Can not read register x while CPU is running
查看>>
【STM32CubeMX+FreeRTOS 】29,prtinf卡死;4任务只运行了3个;W5500联网失败(堆栈不能太大或者太小)
查看>>
【STM32+FreeRTOS +W5500移植要点】30,RTOS中断;从TIM2,主TIM3;RTOS主要用在LCD中;RT-Thread;标志重定义问题 2019年01月22日
查看>>
【STM32+FPGA+FSMC】31,FSMC熟练掌握;KEIL5生成bin文件;SDRAM的使用;IAP检验码 2019年04月10日
查看>>
【IC1】【转 非常好】运算放大器使用的六个经验
查看>>
【IC-ADC 3】ADC的选型
查看>>
2019年03月18日 查看数据手册的注意点,极限参数、电气参数、推荐参数
查看>>
HiKey960/970用户手册;HiKey960 Development Board User Manual
查看>>
【IC8】作为一名硬件工程师,需要哪些知识?
查看>>
【书籍推荐】FPGA,xilinx
查看>>
N9-SQL注入(union注入)
查看>>
N10-sql注入(information_schema注入)
查看>>