Skip to content

wwhai/micro-coroutine

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

协程库实现

本项目实现了一个简单的协程库,用于在 C 语言中进行协程的创建、调度和管理。协程是一种轻量级的用户态线程,允许程序在不同的执行上下文之间进行切换,而无需像线程那样进行系统级的上下文切换,从而提高程序的性能和响应速度。

文件结构

本项目主要包含以下几个文件:

1. coroutine.h

这是协程库的头文件,定义了协程和协程调度器的结构体,以及相关的函数原型和常量。主要包含以下内容:

  • 协程结构体 coroutine_t:包含协程的上下文、栈空间、执行函数、参数、栈大小、运行状态、开始时间、已运行时间和睡眠时间等信息。
  • 协程调度器结构体 coroutine_scheduler_t:包含协程数组、当前运行的协程 ID、运行中的协程数量和主上下文。
  • 函数声明:包括协程的初始化、创建、让出、恢复、睡眠、统计和销毁等操作的函数声明。

2. coroutine.c

这是协程库的实现文件,包含了 coroutine.h 中声明的所有函数的具体实现。主要功能如下:

  • coroutine_init:初始化协程调度器。
  • coroutine_create:创建一个新的协程,并将其添加到调度器中。
  • coroutine_yield:让出当前协程的执行权,将控制权返回给调度器。
  • coroutine_resume:恢复指定 ID 的协程的执行。
  • coroutine_sleep:使当前协程睡眠指定的毫秒数。
  • coroutine_statistics:输出所有运行中的协程的已运行时间。
  • coroutine_destroy:销毁协程调度器,释放所有协程的栈空间。

3. main.c

这是一个示例程序,演示了如何使用协程库。主要步骤如下:

  • 初始化协程调度器。
  • 创建三个协程:coroutine_acoroutine_bcoroutine_c
  • 在主循环中,不断检查每个协程的状态,根据其睡眠时间和运行状态来决定是否恢复其执行。
  • 输出协程的统计信息并销毁协程调度器。

使用方法

编译

coroutine.hcoroutine.cmain.c 放在同一目录下,然后使用以下命令进行编译:

gcc -o coroutine coroutine.c main.c

运行

编译完成后,使用以下命令运行程序:

./coroutine

注意事项

  • 协程的最大数量由 COROUTINE_MAX 宏定义,默认为 128。
  • 每个协程的栈大小由 COROUTINE_STACK_SIZE 宏定义,默认为 64KB。
  • 协程的睡眠时间是以毫秒为单位的。

示例代码解释

coroutine_a

该协程打开一个名为 example.txt 的文件,逐行读取文件内容并输出,然后让出执行权。

coroutine_b

该协程睡眠 2 秒,然后输出一条消息。

coroutine_c

该协程使用一个计数器,从 0 开始计数,每次计数后睡眠 100 毫秒,直到计数器达到 10。

总结

本项目通过使用 ucontext.h 库,实现了一个简单的协程库。协程的调度是在用户态完成的,避免了系统级的上下文切换开销,提高了程序的性能。同时,通过示例程序演示了如何使用该协程库。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published