当前位置: 首页 > news >正文

protothread协程库实现非阻塞延时(无操作系统)

协程库官网下载
参考连接
https://blog.csdn.net/Naisu_kun/article/details/135396601

这个协程库是根据行号来进行跳转的,struct pt里面只有一个short类型变量用来存 当前行号,

/* 
*阻塞并等待,直到condition为真。
*这个宏会阻塞原线程,直到满足指定的条件
*/
一个指向原线程控制结构的指针。
#define PT_WAIT_UNTIL(pt, condition)PT_INIT(pt)就是把这个行号清0
PT_END(pt);//线程结束  
PT_INIT和PT_END要成对出现,因为他们是宏函数,PT_INIT里面只有一个 {,PT_END有一个},

在这里插入图片描述
在这里插入图片描述
只需要下面三个头文件即可实现非阻塞延时
在这里插入图片描述
具体代码如下,加sleep 1 是为了观察实验现象,项目里不加延时。

#include <stdio.h>
#include <stdlib.h>
#include "pt.h"
#include <time.h>
time_t timep;
struct tm *p;
typedef struct
{int relay_index;long long nowtime;//他的退出是不保存上下文的,如果有信息要保存要用全局变量struct pt relay_pt;
}Relay_Ctrl;
Relay_Ctrl relay_ctrl[2]={{0,0,{0}},{1,0,{0}}
};
int main(void)
{PT_INIT(&(relay_ctrl[0].relay_pt));//线程1初始化PT_INIT(&(relay_ctrl[1].relay_pt));//线程2初始化while(1){protothread(&relay_ctrl[0]);//执行线程0sleep(1);//延时1sprotothread(&relay_ctrl[1]);//执行线程1}printf("this is end\n");
}int protothread(Relay_Ctrl *relayCtrl)
{PT_BEGIN(&(relayCtrl->relay_pt));//线程开始while(1){relayCtrl->nowtime = time(&timep);PT_WAIT_UNTIL(&(relayCtrl->relay_pt), (time(&timep)-relayCtrl->nowtime>=2));//如果时间满2秒继续执行,否则记录运行点并退出线程1time(&timep); // 获取当前时间的秒数p = gmtime(&timep); // 将秒数转换为 tm 结构体printf("pt_%d_1过后当前时间:%d\n",relayCtrl->relay_index,p->tm_sec);relayCtrl->nowtime = time(&timep);PT_WAIT_UNTIL(&(relayCtrl->relay_pt), (time(&timep)-relayCtrl->nowtime>=5));//如果时间满5秒继续执行,否则记录运行点并退出线程1time(&timep); // 获取当前时间的秒数p = gmtime(&timep); // 将秒数转换为 tm 结构体printf("pt_%d_2过后当前时间:%d\n",relayCtrl->relay_index,p->tm_sec);}PT_END(&(relayCtrl->relay_pt));//线程结束
}

在这里插入图片描述

注意避坑
不能用switch,不要用局部变量,因为他是不保存上下文的。
在这里插入图片描述
在这里插入图片描述

相关文章:

  • LangChain 中主流的 RAG 实现方式
  • 第5.5章:ModelScope-Agent:支持多种API无缝集成的开源框架
  • Golang | 自行实现并发安全的Map
  • 运维打铁:Mysql 分区监控以及管理
  • 分享Matlab成功安装Support Package硬件支持包的方法
  • 通过音频的pcm数据格式利用canvas绘制音频波形图
  • GStreamer 简明教程(十一):插件开发,以一个音频生成(Audio Source)插件为例
  • Centos7.2安装Xmap
  • 司法考试模拟考试系统
  • LLM Graph Rag(基于LLM的事件图谱RAG)
  • 红黑树——如何靠控制色彩实现平衡的?
  • 记录搭建自己应用中心
  • OpenAI 推出「轻量级」Deep Research,免费用户同享
  • CSS 入门全解析
  • 0. Selenium工具的安装
  • deep鼠标跟随插件
  • 跟着尚硅谷学vue-day5
  • NVIDIA 高级辅助驾驶汽车安全系统 系列读后感(1)
  • 数据湖DataLake和传统数据仓库Datawarehouse的主要区别是什么?优缺点是什么?
  • excel如何绘制直方图
  • 四川省社科联期刊:不建议在读硕士、博士将导师挂名为第一作者
  • 国家卫健委:工作相关肌肉骨骼疾病、精神和行为障碍成职业健康新挑战
  • 脱发后怎么把头发养回来?脱发自救指南来了
  • 哈马斯同意释放剩余所有以方被扣押人员,以换取停火五年
  • 女儿被偷拍后,一个父亲的战斗
  • 从“高阶智驾”到“辅助驾驶”,上海车展上的“智驾”宣发变调