c语言等待几秒执行下一步_C 语言实现协程

2023-11-08

C 语言实现协程,最困难的部分就是上下文信息的保存和还原。这样才能够做到,让协程在任意位置让出执行权限,稍后再恢复到中断位置继续执行。C 实现协程一般有几个方案。

使用第三方库来保存恢复上下文数据,比如ucontext

使用汇编来保存上下文信息

使用setjmp / longjmp 保存恢复上下文信息

使用switch case的特性来做上下文断点继续,上下文信息需要用static变量保存。比如Protothreads

使用线程来保存上下文信息

本文,使用了switch case的特性来保存中断位置,使用数据结构和static变量来保存上下文信息,使用宏来构建API调用。由于我使用过lua和unity c#协程进行了产品开发。所以,这套实现会贴近unity中C#的使用习惯。完成了一下功能:

在协程执行的任意位置暂停,让出执行权限

恢复协程继续上次中断的地方继续执行

通过static变量和数据结构保存协程数据

协程让出执行后,等待特定的帧数,时间,和其它协程完成

开始看代码:

typedef enum

{

/**

* Coroutine wait for frame count to waitValue

*/

coroutine_wait_frame,

/**

* Coroutine wait for second count to waitValue

*/

coroutine_wait_second,

/**

* Coroutine wait for other Coroutine to finish

*/

coroutine_wait_coroutine,

/**

* Coroutine just run forward

*/

coroutine_wait_none,

}

CoroutineWaitType;

先定义协程让出执行后,等待的类型。可以看到这里定义了几种类型,可以等待帧数,时间,其它协程。

typedef enum

{

/**

* Coroutine enter queue ready to running

*/

coroutine_state_ready,

/**

* Coroutine has started to execute

*/

coroutine_state_running,

/**

* Coroutine already finished and waiting for reuse

*/

coroutine_state_finish,

}

CoroutineState;

这里定义协程的状态。等待执行,正在执行包括中断的也算在执行的,还有执行完成的。我们后面会介绍,有一个协程管理器。所有的协程进入管理器,被轮询检测。完成后的协程会被缓存起来,下次请求协程的时候会先检查缓存的协程可否使用。

typedef struct Coroutine Coroutine;

typedef void (*CoroutineRun)(Coroutine* coroutine);

struct Coroutine

{

/**

* Record coroutine run step

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c语言等待几秒执行下一步_C 语言实现协程 的相关文章

  • 金蝶 K3 ERP 采购管理 表结构明细 POOrder/Entry

    select from t TableDescription 金蝶K3表名备注 t tabledescription 采购订单POOrder 单头 FBrNo 公司机构内码 STRING 公司机构内码 FTranType 单据类型 INTE
  • X.509数字证书内容结构

    更多区块链技术与应用分类 区块链应用 区块链开发 以太坊 Fabric BCOS 密码技术 共识算法 比特币 其他链 通证经济 传统金融场景 去中心化金融 防伪溯源 数据共享 可信存证 X 509证书 数字证书是现代信息安全的核心技术 无论
  • Calendar类常用方法

    Calendar常量 field 的作用 Calendar cal Calendar getInstance cal get Calendar DATE 当天 1 31 cal get Calendar DAY OF MONTH 当天 1
  • JTest的使用

    jtest 项目中用到了JTest 一款商业化java白盒测试工具 开个头慢慢补充 简介 jtest是parasoft公司推出的一款针对java语言的自动化白盒测试工具 它通过自 动实现java的单元测试和代码标准校验 来提高代码的可靠性
  • elasticsearch集群文件及路径设置

    es集群文件路径 1 数据目录 日志目录以及插件目录 默认情况下es会将plugin log data config file都放在es的安装目录中 这有一个问题 就是在进行es升级的时候 可能会导致这些目录被覆盖掉使我们集群中的文件或数据
  • Postman应用——下载注册和登录

    文章目录 下载安装 注册登录 注册账号 登录账号 下载安装 Postman下载 https www postman com 访问链接后 进入首页 根据自己的操作系统下载对应的版本 找到下载到的目录直接双击 exe文件 会默认安装在C盘 安装
  • LeetCode(力扣)题目中二叉树的如何生成?根据给定顺序列表生成二叉树(python)

    在刷 leetcode 二叉树相关的题目时 经常有这样给定的例子 例如 检查平衡性 实现一个函数 检查二叉树是否平衡 在这个问题中 平衡树的定义如下 任意一个节点 其两棵子树的高度差不超过 1 示例 1 给定二叉树 3 9 20 null
  • Mybatis-plus 分页排序 错乱-丢失

    今天生产环境出行了一个分页排序错乱的问题 当时有点懵 用的mybatis plus的分页插件实现的 往常也用但是没有出现这个 分页排序 错乱 丢失问题 说实话当时有点懵 经过排查分析 得出了结果 Mybatis plus 分页排序 错乱 丢
  • C语言变参数函数详解

    文章目录 一 前言 二 printf函数源码 三 C语言函数调用堆栈过程 调用约定 压栈过程 那么再来看看其他情况 四 C语言实现可变参数详解 五 需要关注的一些问题 一 前言 在C语言中 我们不管是使用标准库函数还是使用自定义的函数 我们
  • 帧同步(LockStep)该如何反外挂

    在中国的游戏环境下 反挂已经成为了游戏开发的重中之重 甚至能决定一款游戏的生死 吃鸡就是一个典型的案例 目前参与了了一款动作射击的MOBA类游戏的开发 同步方案上选择了帧同步技术 LockStep而非snapshots以下同 那么就有很多人
  • LUA实现麻将胡牌判定

    用LUA实现麻将胡牌的一个思路 hand table 41 42 43 22 21 43 22 11 11 11 42 33 33 33 手牌 card count table 1 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8
  • 【若依】线程池,分页工具,定时任务,aop日志,全局异常处理功能实现

    若依 线程池 分页工具 定时任务 aop日志 全局异常处理功能实现 1 分页工具 使用方法 在调用sql语句前 调用 PageHelper startPage 方法就行了 若依包装过了 调用startPage 方法 1 pagehelper
  • 用c++编写的植物大战僵尸

    源码如下 include
  • 显卡3080设备CentOS 7.9 环境安装最新anconda、tensorflow-gpu 、cudatoolkit、cudnn、 python

    目标 使用3080显卡搭建环境 系统安装 显卡驱动安装 安装anconda 安装 python 安装 cuda 安装 cudnn 安装 tensorflow 一 系统安装 详见历史文档 二 显卡驱动安装 详见历史 三 整理自己需要安装的环境
  • 期货不变的本质是什么意思(期货不变的本质是什么意思呀)

    期货的本质是什么 本质是一个风险转移工具 通过把风险转移给愿意投机获利 亏损的人 产业方得以获得确定的盈利预期 这是期货的核心价值 狭义理论认为期货市场是 零和 负和 游戏 但如果把眼光放宽 把实体产业加进来 可以发现期货是市场环境里一项必
  • web python识花_TensorFlow迁移学习识花实战案例

    TensorFlow 迁移学习识花实战案例 本文主要介绍如何使用迁移学习训练图片识别花朵的模型 即识别出图片上是何种花朵 本文档中涉及的演示代码和数据集来源于网络 你可以在这里下载到 TRANSFER LEARNING zip 本模块将通过
  • cocos2d-x客户端与Java服务器的通信(一)

    o 貌似自己已经有一段时间没有写博客了 其实主要原因还是觉得自己水平有限 加上上班实在是太忙 实在抽不出时间来写博客 言归正传 大家都知道 在网络游戏开发中 网络通信一直是个比较大的难题 一个服务器可能要同时处理几千上万甚至上百万的用户数据
  • 14款开源或免费的GIS软件

    1 QGIS 原称Quantum GIS QGIS 原称Quantum GIS 是一个跨平台的桌面GIS软件 它提供数据的显示 编辑和分析功能 可以自动生成地图 并且能够处理地理空间数据 最后形成你期待的地图数据 它于2004年成为地理空间
  • Idea使用工具Statistic进行代码数量,注释的统计

    Statistic是idea上面的一个用于统计代码数量 注释数量的工具 1 安装 重启idea后 工具就能直接使用 如过没有结果的话 刷新下 扩展设置

随机推荐