# 是什么?
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、线程池、定时器池、协程、日志、命令终端、状态机、行为树等非常实用的开发组件,它还有完备实用的启动框架。 它可以让应用开发者从实现细节中解放出来,专注于功能逻辑
资源推荐
资源详情
资源评论
收起资源包目录
C++的百宝箱,是一个完备的Linux应用l软件开发工具库与运行框架 (593个子文件)
default.conf 202B
ccronexpr.cpp 35KB
context_imp.cpp 24KB
state_machine_test.cpp 19KB
client.cpp 18KB
signal_event_test.cpp 16KB
common_loop_test.cpp 15KB
key_event_scanner_test.cpp 13KB
thread_pool.cpp 12KB
request_parser_test.cpp 12KB
state_machine.cpp 12KB
log.cpp 12KB
terminal_commands.cpp 12KB
fd_event_test.cpp 11KB
md5.cpp 10KB
async_pipe.cpp 10KB
scheduler.cpp 9KB
fs.cpp 9KB
serializer.cpp 9KB
dns_request.cpp 9KB
aes.cpp 9KB
url.cpp 9KB
sequence_action_test.cpp 8KB
common_loop_signal.cpp 8KB
tcp_connector.cpp 8KB
to_graphviz.cpp 8KB
serializer_test.cpp 8KB
work_thread.cpp 8KB
buffered_fd.cpp 8KB
scheduler_test.cpp 8KB
server_imp.cpp 7KB
telnetd.cpp 7KB
uart.cpp 7KB
key_event_scanner.cpp 7KB
string_test.cpp 7KB
base64.cpp 7KB
fs_test.cpp 7KB
args.cpp 7KB
action_executor_test.cpp 7KB
common_loop_run.cpp 7KB
thread_pool_test.cpp 7KB
string.cpp 7KB
buffer_test.cpp 6KB
timer_pool_test.cpp 6KB
terminal.cpp 6KB
common.cpp 6KB
async_test.cpp 6KB
url_test.cpp 6KB
dns_request_test.cpp 6KB
tcp_server.cpp 6KB
action.cpp 5KB
tcp_client.cpp 5KB
request_parser.cpp 5KB
sleep_action_test.cpp 5KB
main.cpp 5KB
fd_test.cpp 5KB
async_sink.cpp 5KB
main.cpp 5KB
socket_fd.cpp 5KB
channel_test.cpp 5KB
async.cpp 5KB
run_in_backend.cpp 5KB
mutex_test.cpp 5KB
action_executor.cpp 5KB
tcp_acceptor.cpp 5KB
wrapper_action_test.cpp 5KB
loop_wdog.cpp 5KB
timer_fd_test.cpp 5KB
buffer.cpp 5KB
run_in_frontend.cpp 5KB
common_loop_timer.cpp 5KB
terminal_key_events.cpp 5KB
tcp_hex_client.cpp 4KB
timer_fd.cpp 4KB
log_imp.cpp 4KB
json.cpp 4KB
error_signals.cpp 4KB
async_pipe_test.cpp 4KB
sockaddr.cpp 4KB
async_file_sink.cpp 4KB
game.cpp 4KB
if_else_action_test.cpp 4KB
fd.cpp 4KB
alarm.cpp 4KB
tcp_nc_client.cpp 4KB
common_loop.cpp 4KB
fd_event.cpp 4KB
timer_pool.cpp 4KB
main.cpp 4KB
time_counter.cpp 4KB
split_cmdline_test.cpp 4KB
repeat_action_test.cpp 4KB
tcp_echo.cpp 4KB
udp_socket_test.cpp 4KB
tcp_nc_server.cpp 4KB
timer_event_test.cpp 4KB
tcp_rpc.cpp 4KB
json_test.cpp 4KB
argument_parser_test.cpp 4KB
tcp_nc_server.cpp 4KB
共 593 条
- 1
- 2
- 3
- 4
- 5
- 6
资源评论
Java程序员-张凯
- 粉丝: 1w+
- 资源: 6651
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 农村信用社联合社计算机信息系统投产与变更管理办.docx
- 农村信用社联合社计算机信息系统数据管理办法.docx
- 利用SPSS作临床效度分析线上计算网站介绍-医学研究部统计谘.(医学PPT课件).ppt
- 利用Zabbix监控mysqldump定时备份数据库状态.docx
- 利用计算机解决问题的基本过程.doc
- 化工铁路通信工程总结.doc
- 北京大学网络教育软件工程作业.docx
- 医药公司(连锁店)计算机操作规程未新系统的自行按照旧制修改-新系统过制的编号加修模版.doc
- 医药公司(连锁店)计算机系统操作规程模版.doc
- 医药连锁门店计算机系统的操作和管理程序未新系统的自行按照旧制修改-新系统过制的编号加修模版.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功