1 Star 2 Fork 1

朕与将军解战袍 / coroutine

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MIT

Coroutine

协程 (Coroutine) 是由应用程序调度的用户态线程, 是一种绿色线程 (Green Thread) 。使用协程可以实现单线程的异步。这个仓库实现了 x86 (包含 32 位和 64 位) 平台的协程。可在 GCC 11.2 及以下的 GCC 编译器上编译。

简介

函数类型

为了能够适配多种函数, 本库调度的协程函数声明应为:

void* foo(void* args);

传递参数的时候, 结构体必须通过指针传递, 而基础类型可以通过强转为 void* 类型传递, 但可能会触发编译器警告。

创建协程

可以通过函数 co_start 启动一个协程:

void* foo(void*) {
    // ...
}

Coroutine foo_routine = co_start(foo, args);

协程被创建后就会进入待调度状态, 等待调度 。

yield

可以通过 co_yield 函数, 将控制权主动交给调度器, 调度器会切换到其它的 Coroutine 中运行:

void* foo(void*) {
    // ...
    co_yield(); // --------------------------
    // ...      //                          |
}               //                          |
//                                          |
//                        -----------       |
//                   -----| excutor | <-----|
//                   |    -----------
//                   |
//                   |
void* bar(void*) {// |
    // ...           |
    co_yield();//    |
    // ...        <---
}

等待协程结束 (获取协程返回值)

可以通过函数 co_wait 来等待协程结束, 并获取返回值:

void *ret = co_wait(foo_routine);

注意:不通过 co_wait 等待协程结束, 而协程又没有被销毁的话, 会造成内存泄漏

取消协程 (销毁协程)

可以通过函数 co_cancel 取消 (或者说) 销毁一个协程:

co_cancel(foo_routine);
// foo_routine 被销毁, 不会再被调度

项目结构

本库有多个模块, 每个模块都是一个目录, 目录中的 README 文件是模块的文档。 本库的根目录下的 predule.h 中是各种常用头文件的导入。更详细的信息请参考模块目录下的文档。

示例代码

example 目录下是各种示例代码。

MIT License Copyright (c) 2022 朕与将军解战袍 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

简介

C语言实现的有栈协程库 展开 收起
C 等 2 种语言
MIT
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/L_Lawliet_moon/coroutine.git
git@gitee.com:L_Lawliet_moon/coroutine.git
L_Lawliet_moon
coroutine
coroutine
master

搜索帮助