代码拉取完成,页面将自动刷新
协程 (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);
协程被创建后就会进入待调度状态, 等待调度 。
可以通过 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
目录下是各种示例代码。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
1. 开源生态
2. 协作、人、软件
3. 评估模型