【学习笔记】PT协程-未完待续-单线程编程-协程

时间:2024-11-12 10:37:37

单线程,所有协程都是共享栈–换句话说:裸机

代码结构

在这里插入图片描述
十分精简
lc 有两个版本

文件 说明
lc-addrlabels.h 使用GCC扩展语法实现的协程基础
lc-switch.h 使用switch语句实现的协程基础
lc.h 用于选择GCC语法还是switch语句实现
pt.h 基于lc.h实现协程API
pt-sem.h 协程间通信(信号量)的实现

程序的跳转【哪里退出进哪里的跳转】

0.程序在switch中循环,跳转的过程中只关心case 的标号的位置;
1.利用这个特性保证 PT_WAIT_UNTILL的进入跳转的特性;
2.利用结构体 pt记录跳转的“位置”,“位置”信息即为将当前代码的行数_LINE_作为跳转的位置lc

struct pt {
  lc_t lc;
};

main(void)
{
  int i= 1;
HH:  
  printf("%d\r\n",i);
  switch (i)
  {
  case 0://0
    printf("0");
    while(1){
      case 1:;//入口
      printf("case 1");
      return 0;
    }
  }
  i++;
  goto HH;

在例程example-small.c 展开

在这里插入图片描述
当lc == 0 则表示经历了一次循环

进行跳转位置的说明

在这里插入图片描述
BEGIN 和 END 需要成对使用

END的作用是 表示本次 完成所有的流程(PT_ENDED 3),下次从头开始跳转((pt)->lc = 0;)

线程中慎用零时变量
因为没有栈,所有的零时变量都只在本次调用中有效,后面的调用无效
所有需要使用 全局 或者 静态局部传值;

线程完成退出 表示完成了线程的任务

  • PT_EXIT 中间过程退出 只能自己退出自己 ,只能在本thread中 使用
  • PT_END 整个过程退出

信号量

多个信号时 ,则一直运行到信号被阻塞;
在这里插入图片描述

条件阻塞

在这里插入图片描述

线程+调度

PT_THREAD(线程函数)
PT_SCHEDULE(线程函数)调度这个线程,
其实就是判断线程是否完成:未完成返回1( <2 ),完成,执行一遍返回0(>=2 就)

线程的状态机

#define PT_WAITING 0 //
#define PT_YIELDED 1
#define PT_EXITED 2
#define PT_ENDED 3

线程的调度就是执行一次协程函数

在这里插入图片描述

释放cpu控制权yeild

让其他协程工作,下次还是这个入口
在这里插入图片描述
出让了CPU之后 其他子线程可以调用;
在这里插入图片描述