# 是什么?
coroutine 是基于 event 架构的协程库。它帮忙开发者处理异步模型不擅长的顺序型业务逻辑。
# 为什么需要协程
基于事件驱动的程序模型擅长处理 *“当发生xx事件,就做yy动作”* 的逻辑。
如果事件之间是相互孤立的,那么就非常好处理。如果有简单的依赖,则需要加状态机进行处理。
一旦遇到了顺序型的业务逻辑,如:*“先做A动作,然后做B动作。如果A与B动作中任意一个的不成功,则做C动作,否则循环做D动作 ...”*
基于事件驱动的程序实现起来就需要设计一个非常复杂的状态机,业务代码非常零散且难于维护。
反面教材有 [Javascript 的回调地狱](http://callbackhell.com/),非常恐怖。
![Javascript的回调地狱](https://pic1.zhimg.com/v2-cf1c78890006e078a538842a0caa7127_1440w.jpg?source=172ae18b)
解决方案有二:
1. 线程
2. 协程
线程的不足:
- 比较重,线程是CPU进行任务调度的单元,为每个业务创建一个线程占CPU且耗内存;
- 线程之间的切换不可控;
- 资源抢占不易管理。
协程的优点:
- 轻量,只需要为每个协程分配一个栈即可,栈大小可指定;
- 协程之间切换,由程序自行控制,使用 yield(), wait() 主动切换,易调试;
- 无资源抢占问题。
# 有哪些功能?
详见 scheduler.h 的接口定义。
# 怎么使用?
详见各单元测试用例。
## 基础用法
```c++
int main()
{
using namespace tbox::event;
using namespace tbox::coroutine;
Loop *sp_loop = Loop::New();
SetScopeExitAction([sp_loop]{ delete sp_loop;});
Scheduler sch(sp_loop);
//! 定义协程1的行为
int routine1_count = 0;
auto routine1_entry = [&] (Scheduler &sch) {
for (int i = 0; i < 20; ++i) {
++routine1_count;
sch.yield(); //! 主动让出执行权
}
};
//! 定义协程2的行为
int routine2_count = 0;
auto routine2_entry = [&] (Scheduler &sch) {
for (int i = 0; i < 10; ++i) {
++routine2_count;
sch.yield(); //! 主动让出执行权
}
};
sch.create(routine1_entry); //! 创建协程1,并开始执行
sch.create(routine2_entry); //! 创建协程2,并开始执行
sp_loop->exitLoop(chrono::seconds(1));
sp_loop->runLoop();
return 0;
}
```
## 辅助组件
为了让协程更好用,特设计了多种辅助组件。
组件有:
- Channel,通道,多个协程等待数据,当有数据进入管道时最早等待的协程被唤醒,类似于 golang 的 ch;
- Semaphore,信号量,与多线程间的sem类似;
- Mutex,互斥量,与多线程间的mutex类似;
- Condition,条件量,当多个条件同时满足或满足任意时唤醒协程;
- Broadcast,广播,多个协程等待一个信号,当该信号发出时,所有等待的协程都被唤醒。
具体使用方法,见各组件的单元测试用例。
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
C++的百宝箱,是一个完备的Linux应用l软件开发工具库与运行框架。 它有通信库(TCP/UDP/串口)、HTTP、线程池、定时器池、协程、日志、命令终端、状态机、行为树等非常实用的开发组件,它还有完备实用的启动框架。 它可以让应用开发者从实现细节中解放出来,专注于功能逻辑。应用于智能硬件,如:机器人(扫地机、商用服务机器人)、IPC、无人机、车载等;边缘计算组件,如:智能家居网关、IOT边缘网关等;后台服务型软件,如:cpp-socks5;
资源推荐
资源详情
资源评论
收起资源包目录
C++ Treasure Box,C++百宝箱,是一个基于 Reactor 模式的服务型 开发框架 与 组件库 (575个子文件)
default.conf 202B
ccronexpr.cpp 35KB
context_imp.cpp 24KB
state_machine_test.cpp 18KB
client.cpp 18KB
signal_event_test.cpp 15KB
common_loop_test.cpp 15KB
key_event_scanner_test.cpp 12KB
request_parser_test.cpp 11KB
state_machine.cpp 11KB
thread_pool.cpp 11KB
log.cpp 11KB
terminal_commands.cpp 11KB
md5.cpp 10KB
async_pipe.cpp 9KB
fd_event_test.cpp 9KB
scheduler.cpp 8KB
fs.cpp 8KB
serializer.cpp 8KB
dns_request.cpp 8KB
aes.cpp 8KB
url.cpp 8KB
sequence_action_test.cpp 8KB
common_loop_signal.cpp 8KB
tcp_connector.cpp 8KB
to_graphviz.cpp 7KB
serializer_test.cpp 7KB
work_thread.cpp 7KB
buffered_fd.cpp 7KB
scheduler_test.cpp 7KB
server_imp.cpp 7KB
telnetd.cpp 7KB
uart.cpp 7KB
key_event_scanner.cpp 7KB
string_test.cpp 7KB
args.cpp 6KB
base64.cpp 6KB
fs_test.cpp 6KB
action_executor_test.cpp 6KB
common_loop_run.cpp 6KB
string.cpp 6KB
buffer_test.cpp 6KB
timer_pool_test.cpp 6KB
terminal.cpp 6KB
common.cpp 5KB
thread_pool_test.cpp 5KB
async_test.cpp 5KB
url_test.cpp 5KB
dns_request_test.cpp 5KB
tcp_server.cpp 5KB
tcp_client.cpp 5KB
request_parser.cpp 5KB
sleep_action_test.cpp 5KB
action.cpp 5KB
main.cpp 5KB
fd_test.cpp 5KB
async_sink.cpp 5KB
main.cpp 5KB
socket_fd.cpp 4KB
channel_test.cpp 4KB
async.cpp 4KB
run_in_frontend.cpp 4KB
mutex_test.cpp 4KB
action_executor.cpp 4KB
tcp_acceptor.cpp 4KB
wrapper_action_test.cpp 4KB
loop_wdog.cpp 4KB
timer_fd_test.cpp 4KB
buffer.cpp 4KB
run_in_backend.cpp 4KB
terminal_key_events.cpp 4KB
common_loop_timer.cpp 4KB
tcp_hex_client.cpp 4KB
log_imp.cpp 4KB
timer_fd.cpp 4KB
json.cpp 4KB
async_pipe_test.cpp 4KB
sockaddr.cpp 4KB
async_file_sink.cpp 4KB
game.cpp 4KB
fd_event.cpp 4KB
error_signals.cpp 4KB
if_else_action_test.cpp 4KB
fd.cpp 4KB
alarm.cpp 4KB
tcp_nc_client.cpp 3KB
common_loop.cpp 3KB
timer_pool.cpp 3KB
main.cpp 3KB
time_counter.cpp 3KB
split_cmdline_test.cpp 3KB
repeat_action_test.cpp 3KB
tcp_echo.cpp 3KB
udp_socket_test.cpp 3KB
tcp_nc_server.cpp 3KB
tcp_rpc.cpp 3KB
timer_event_test.cpp 3KB
json_test.cpp 3KB
argument_parser_test.cpp 3KB
tcp_nc_server.cpp 3KB
共 575 条
- 1
- 2
- 3
- 4
- 5
- 6
资源评论
Java程序员-张凯
- 粉丝: 1w+
- 资源: 6651
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功