boost::asio::io_context类
//有个疑惑: 向io_context对象中提交的任务只能被顺序化的执行.
//下面这个构造函数表明可以运行多线程啊。。。。。
/**
* Construct with a hint about the required level of concurrency.
*
* @param concurrency_hint A suggestion to the implementation on how many
* threads it should allow to run simultaneously.
*/
BOOST_ASIO_DECL explicit io_context(int concurrency_hint);
io_context类为异步I/O对象提供核心功能,对象包括:
- boost::asio::ip::tcp::socket
- boost::asio::ip::tcp::acceptor
- boost::asio::ip::udp::socket
- boost::asio::deadline_timer
boost::asio::io_context io_context;
...
for (;;)
{
try
{
io_context.run();
break; // run() exited normally
}
catch (my_exception& e)
{
// Deal with exception as appropriate.
}
}
使用以下函数向io_context提交任务
- boost::asio::dispatch
- boost::asio::post
- boost::asio::defer
void my_task()
{
...
}
...
boost::asio::io_context io_context;
// Submit a function to the io_context.
boost::asio::post(io_context, my_task);
// Submit a lambda object to the io_context.
boost::asio::post(io_context,
[]()
{
...
});
// Run the io_context until it runs out of work.
// Run the io_context until it runs out of work.
// Run the io_context until it runs out of work.
io_context.run();
io_context.restart();
boost::asio::post(io_context, my_task);
io_context.run();
如果希望在调用run()函数后即使做完任务后也不要run()函数返回,则可使用以下类实现
boost::asio::executor_work_guard
asio::io_context io_context;
asio::executor_work_guard<asio::io_context::executor_type>
work = asio::make_work_guard(io_context);
......
work.reset(); // Allow run() to exit. @endcode
成员函数
1. count_type run();
- 调用 run() 函数后程序将被阻塞到任务被完成同时没用其他任务派遣,或者直到
io_context
调用 stop() 函数停止为止- 多线程中可以调用 run() 函数来开启一个线程池,
io_context
可以在线程池中执行处理程序。在池中等待的所有线程都是等效的,io_context
可以选择其中的任何一个线程来调用处理程序。- 在 run() 函数正常退出后立即调用
run()
、run_one()
、poll()
或poll_one()
函数将会立即返回,除非在调用这些函数前调用restart()
函数。- 返回被处理的程序的数量 count_type
2. std::size_t run_for(const chrono::duration<Rep, Period>& rel_time);
- 在一定时间内处理事件循环,阻塞到任务被完成同时没用其他任务派遣,或者直到
io_context
调用 stop() 函数停止 或 超时 为止rel_time
: 表示时间段
3. std::size_t run_until(const chrono::time_point<Clock, Duration>& abs_time);
abs_time
: 阻塞到哪个时间点
4. count_type run_one();
- 最多处理一个任务, 处理完就退出 或 io_context被停止
- 函数正常退出后立即调用 run()、 run_one()、poll() 或 poll_one() 函数将会立即返回,除非在调用这些函数前调用 restart() 函数。
count_type
: 返回 0 表示io_conutext被停止
5. std::size_t run_one_for(const chrono::duration<Rep, Period>& rel_time);
6. std::size_t run_one_until(const chrono::time_point<Clock, Duration>& abs_time);
7. count_type poll();
- 以非阻塞方式处理任务
- 返回处理的任务数量
8. count_type poll_one();
- 以非阻塞方式处理任务,最多处理一个
- 返回 0 表示io_context被终止
9. void stop();
此函数将终止io_context对象的事件处理,此函数不阻塞,而只是向io_context发出停止信号。它的run()或run_one()成员函数的所有调用都应该尽快返回。对run()、run_one()、poll()或poll_one()的后续调用将立即返回,直到调用restart()。
10. bool stopped() const;
判断io_context对象的事件处理是否被终止
11. void restart();
重新启动io_context,为后续调用 run() 做准备。必须在run()、run_one()、poll()或poll_one()函数的第二次或更高的调用集之前调用此函数。
boost::asio::io_context类的更多相关文章
- boost::asio::io_service类
大部分使用Boost.Asio编写的代码都会使用几个io_service的实例.io_service是这个库里面最重要的类:它负责和操作系统打交道,等待所有异步操作的结束,然后为每一个异步操作调用其完 ...
- C++ 异步编程:Boost.Asio
Boost.Asio 是一个用于网络和低级 I/O 编程的跨平台 C++ 库,它使用现代 C++ 方法为开发人员提供一致的异步模型 一个异步使用计时器的样例 #include <iostream ...
- 使用Boost.Asio编写通信程序
摘要:本文通过形像而活泼的语言简单地介绍了Boost::asio库的使用,作为asio的一个入门介绍是非常合适的,可以给人一种新鲜的感觉,同时也能让体验到asio的主要内容. Boost.Asio是一 ...
- Boost.Asio的使用技巧
基本概念 Asio proactor I/O服务 work类 run() vs poll() stop() post() vs dispatch() buffer类 缓冲区管理 I/O对象 socke ...
- boost::asio::deadline_timer(理解)
并发与并行: 并发和并行从宏观上来讲都是同时处理多路请求的概念.但并发和并行又有区别,并行是指两个或者多个事件在同一时刻发生:而并发是指两个或多个事件在同一时间间隔内发生. 1.Timer.1 - 使 ...
- boost asio中io_service类的几种使用
io_service类 你应该已经发现大部分使用Boost.Asio编写的代码都会使用几个io_service的实例.io_service是这个库里面最重要的类:它负责和操作系统打交道,等待所有异步操 ...
- boost::asio::ip::tcp中几个重要类型
typedef basic_stream_socket socket; 流式套接字,提供同/异步发送接收数据,连接,绑定,设置套接字选项等功能 对于socket中的connect()方法,它只针对某一 ...
- boost.asio新框架的设计概念总结
1.66版本,boost.asio库重新设计了框架,目前最新版为1.71.读了几天代码后,对框架中相关概念总结.因为是泛型编程的库,所以分析的概念层的设计. 可通过boost官方文档,strand的1 ...
- BOOST.Asio——Overview
=================================版权声明================================= 版权声明:原创文章 谢绝转载 啥说的,鄙视那些无视版权随 ...
随机推荐
- java一些必会算法
经典算法的Java实现 (1)河内塔问题: 42 (2)费式数列 43 (3)巴斯卡(Pascal)三角形 44 (4)蒙地卡罗法求 PI 45 (5)最大公因数.最小公倍数 46 (6)阿姆斯壮数 ...
- n!的质因子分解
其中k为任意质因子,因为a的数值不确定,所有k的值可以任意选择. 以下代码用于求出m!: #include<bits/stdc++.h> LL getpow(LL n,LL k) { LL ...
- Echarts全解注释
coordinate-geo.js文件为地理坐标系的配置参数 mytextStyle={ color:"#333",//文字颜色 fontStyle:"normal&qu ...
- SQL Server 并发死锁解决案例备忘
SET @sql = ' SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; SET DEADLOCK_PRIORITY 10 BEGIN TRAN DE ...
- 剑指offer-反向遍历链表-栈和递归2种方法(一次性跑通)
- Kettle入门--作业和转换的使用
本来想在centos7下部署的,发现因为java版本的问题,无法成功部署,无奈,转到windows平台(后来找到解决方法了,在centos7系统下yum install webkitgtk* -y 就 ...
- linux http配置
yum install httpd 安装http服务器 启动http服务器即可访问 如果不行的话,试着执行命令 firewall-cmd –permanent –add-service=http(该命 ...
- MySQL--数据库连接异常问题汇总
======================================================== Name or service not known 错误消息: [Warning] I ...
- 使用netstat、lsof查看端口占用情况
netstat netstat用来查看系统当前系统网络状态信息,包括端口,连接情况等,常用方式如下: netstat -atunlp,各参数含义如下: -t : 指明显示TCP端口 -u : ...
- About the test in development
Unit test: Specify and test one point of the contract of single method of a class. This should have ...