文章目录

  • C语言协程库async
    • 介绍
    • 开源
    • 特点
    • 依赖
    • API
    • 注意
    • 测试用例

C语言协程库async

本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.

介绍

基于protothreads开发的C语言协程库。关于protothreads可参考文章:

  • 一个“蝇量级” C 语言协程库
  • 利用Protothread实现实时多任务系统

开源

  • github项目地址
  • gitee项目地址

特点

  • 极小的系统占用,适合单片机等资源有限的场所
  • 支持单次运行任务和周期运行任务
  • 任务运行在协程之上,不用加锁,数据不会冲突

依赖

依赖的包:

https://github.com/jdhxyy/tztime.git
https://github.com/jdhxyy/tzmalloc.git
https://github.com/jdhxyy/tzlist.git
https://github.com/jdhxyy/pt.git

使用cip可以一键安装依赖的包:cip:C/C++包管理工具

API

// 运行间隔类型
// 单次运行
#define ASYNC_ONLY_ONE_TIME 0
// 无间隔运行
#define ASYNC_NO_WAIT -1// 时间单位
// 毫秒
#define ASYNC_MILLISECOND 1000
// 秒
#define ASYNC_SECOND 1000000
// 分
#define ASYNC_MINUTE 60000000
// 小时
#define ASYNC_HOUR 3600000000// AsyncFunc 协程函数类型.必须是基于pt实现的函数
typedef int (*AsyncFunc)(void);// AsyncLoad 模块载入.mid是通过tzmalloc申请的内存id
void AsyncLoad(int mid);// AsyncStart 启动协程
// interval是运行间隔.单位:us
// interval是ASYNC_ONLY_ONE_TIME时是单次运行,是ASYNC_NO_WAIT时无间隔运行
bool AsyncStart(AsyncFunc func, int interval);// AsyncStop 停止协程
void AsyncStop(AsyncFunc func);// AsyncRun 协程运行
void AsyncRun(void);

注意

  • 在多线程环境下使用使用函数AsyncStart,AsyncStop得加互斥锁,防止资源冲突
  • 调用AsyncStart函数即可启动协程,协程函数必须是pt函数
  • AsyncRun函数可放在独立的线程中循环执行

测试用例

在windows环境下开发测试。共启动4个协程任务:

  • task1:500ms打印一次
  • task2:1s打印一次
  • task3:单次运行
  • task4:无等待运行。任务函数内控制2s打印一次
#include <stdio.h>
#include <windows.h>
#include <time.h>
#include <stdlib.h>#include "async.h"
#include "tzmalloc.h"
#include "tztime.h"
#include "pt.h"#define RAM_INTERNAL 0static int gMid = -1;static uint64_t getTime(void);static int task1(void);
static int task2(void);
static int task3(void);
static int task4(void);int main() {TZTimeLoad(getTime);TZMallocLoad(RAM_INTERNAL, 20, 100 * 1024, malloc(100 * 1024));gMid = TZMallocRegister(RAM_INTERNAL, "dcom", 4096);AsyncLoad(gMid);AsyncStart(task1, 500 * ASYNC_MILLISECOND);AsyncStart(task2, 1 * ASYNC_SECOND);AsyncStart(task3, ASYNC_ONLY_ONE_TIME);AsyncStart(task4, ASYNC_NO_WAIT);while (1) {AsyncRun();}return 0;
}static uint64_t getTime(void) {struct timeval t;gettimeofday(&t, NULL);return t.tv_sec * 1000000 + t.tv_usec;
}static int task1(void) {static struct pt pt;uint64_t now;int ms;PT_BEGIN(&pt);now = getTime();ms = (int)(now / 1000);printf("%d task1\n", ms);PT_END(&pt);
}static int task2(void) {static struct pt pt;uint64_t now;int ms;PT_BEGIN(&pt);now = getTime();ms = (int)(now / 1000);printf("%d task2\n", ms);PT_END(&pt);
}static int task3(void) {static struct pt pt;uint64_t now;int ms;PT_BEGIN(&pt);now = getTime();ms = (int)(now / 1000);printf("%d task3\n", ms);PT_END(&pt);
}static int task4(void) {static struct pt pt;static uint64_t time;uint64_t now;int ms;PT_BEGIN(&pt);time = getTime();PT_WAIT_UNTIL(&pt, getTime() - time > 2 * ASYNC_SECOND);now = getTime();ms = (int)(now / 1000);printf("%d task4\n", ms);PT_END(&pt);
}

测试输出:

17582 task3
18083 task1
18583 task2
18584 task1
19084 task1
19583 task2
19584 task4
19585 task1
20086 task1
20584 task2
20587 task1
21087 task1
21584 task2
21584 task4
21587 task1
22087 task1
22584 task2
22588 task1
23088 task1
23584 task4
23584 task2
23588 task1
24089 task1
24585 task2
24590 task1
25090 task1
25585 task2
25585 task4
25591 task1
26091 task1
26585 task2
26591 task1
27091 task1
27586 task4
27586 task2
27592 task1

C语言协程库async相关推荐

  1. 一个“蝇量级” C 语言协程库

    协程(coroutine)顾名思义就是"协作的例程"(co-operative routines).跟具有操作系统概念的线程不一样,协程是在用户空间利用程序语言的语法语义就能实现逻 ...

  2. ucontext-人人都可以实现的简单协程库

    1.干货写在前面 协程是一种用户态的轻量级线程.本篇主要研究协程的C/C++的实现. 首先我们可以看看有哪些语言已经具备协程语义: 比较重量级的有C#.erlang.golang* 轻量级有pytho ...

  3. 在C语言中实现协程库(一)----------协程切换原理详解

    从这篇文章开始,我将一点一点详细介绍如何在c语言中实现协程库.并对其中涉及到的技术进行详细的解释. 感兴趣的小伙伴欢迎一起参与 代码地址 协程切换原理 使用glibc中<ucontext.h&g ...

  4. C/C++协程库libco:微信怎样漂亮地完成异步化改造

    如今,微信拥有月活跃用户8亿. 不可否认,当今的微信后台拥有着强大的并发能力. 不过, 正如罗马并非一日建成:微信的技术也曾经略显稚嫩. 微信诞生于2011年1月,当年用户规模为0.1亿左右:2013 ...

  5. cmake导入so库_libgo - 协程库、并行编程库

    libgo是一个使用C++11编写的协作式调度的stackful协程库, 同时也是一个强大的并行编程库, 是专为Linux服务端程序开发设计的底层框架. 目前支持三个平台: Linux (GCC4.8 ...

  6. 协程库st(state threads library)原理解析

    协程库state threads library(以下简称st)是一个基于setjmp/longjmp实现的C语言版用户线程库或协程库(user level thread). 这里有一个基本的协程例子 ...

  7. Libco是一个C/C++协程库,在微信服务中广泛使用

    Table of Contents 协程简介 协程Libco库 libco的特性 PS:CGI框架 PS:Lambda表达式 协程简介 协程这个概念其实在<操作系统>系统里面应该有了解过, ...

  8. c++开源协程库libgo介绍及使用

    协程这个概念,最近这几年可是相当地流行了.尤其 go 语言问世之后,内置的协程特性,完全屏蔽了操作系统线程的复杂细节.甚至使 go 开发者"只知有协程,不知有线程"了.当然 C++ ...

  9. C++ 开源协程库 libco——原理及应用

    1 导论 使用 C++ 来编写高性能的网络服务器程序,从来都不是件很容易的事情.在没有应用任何网络框架,从 epoll/kqueue 直接码起的时候尤其如此.即便使用 libevent, libev这 ...

  10. 微信 libco 协程库原理剖析

    作者:alexzmzheng 同 Go 语言一样,libco 也是提供了同步风格编程模式,同时还能保证系统的高并发能力,本文主要剖析 libco 中的协程原理. 简介 libco 是微信后台大规模使用 ...

最新文章

  1. shell脚本按行读取文件的几种方式
  2. Leon系列处理器结构
  3. 【Python】青少年蓝桥杯_每日一题_4.21_s=a+aa+aaa+aaaa的值
  4. 通过 Intent 传递类对象
  5. mysql.net开发驱动_mysql数据库.net开发驱动(mysql connector net )
  6. 无插件HTML,HTML5+CSS3实现无插件拖拽上传图片(支持预览与批量)分享!
  7. ios html清除缓存图片,iOS,如何清理缓存的图片
  8. 一个三流学校程序员的奋斗历程
  9. Django博客--4.开发博客文章详情页
  10. Theano 中文文档 0.9 - 6. 更新Theano
  11. 基于JAVA+SSH+MYSQL的鲜花订购系统
  12. fullpage在vue单页面当中使用会出现的问题以及解决办法
  13. 如何列出所有用户的所有cron作业?
  14. 哈工大计算机科学与技术邬向前,人工智能学院组队赴哈工大交流学习
  15. 2022年12月奥鹏网络教育大学英语B统考题库试题
  16. zblog php getlist,zblog使用getlist方法调用置顶文章
  17. matlab读取cvs文件的几种方法
  18. Error 1053: The service did not respond to the start or control request in a timely fashion.问题排查
  19. JS十进制转换16进制
  20. Android之世面上程序锁的实现

热门文章

  1. 2D人体姿态估计 - Stakced Hourglass Network(SHN)个人理解
  2. 关于diskpart的命令问题记录
  3. cubieboard笔记
  4. 一开电脑wifi就断网_为什么电脑一连wifi就断网,
  5. 信号隔离器的功能原理是什么?
  6. Redis简介和优势
  7. eemd的r语言序列_EEMD详解
  8. 计算机组成原理笔记|02运算方法和运算器
  9. 【小编教你有效的保护视力】
  10. 【转】LaTeX 符号命令大全