单线程,所有协程都是共享栈–换句话说:裸机
代码结构
十分精简
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之后 其他子线程可以调用;