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
=================================版权声明================================= 版权声明:原创文章 谢绝转载 啥说的,鄙视那些无视版权随 ...
随机推荐
- P1441 砝码称重(搜索+队列dp)
题目链接:传送门 题目大意: 给你n个砝码ai,从中去掉m个后求最多的砝码可表示的重量. n≤20,m≤4,m<n,ai≤100. 思路: 用dfs搜掉m个砝码,然后用队列dp跑出答案,维护答案 ...
- 错题:Test3
/** * * @ClassName: test3 * @Description: TODO(请问主程序运行结果是什么?) * @author yk * @date 2017年3月9日 上午11:20 ...
- [Wannafly挑战赛28][B msc和mcc][预处理+枚举]
链接:https://ac.nowcoder.com/acm/contest/217/B来源:牛客网 msc和mcc 题目描述 msc和mcc是一对好朋友,有一天他们得到了一个长度为n的字符串s. 这 ...
- draw graph
http://www.icl.pku.edu.cn/member/yujs/bsdfiles/html/mpost.htmlUNIX下绘图面面观 http://www.tug.org/metapost ...
- MySQL Replication--跳过复制错误
在MySQL中,有两种跳过复制错误的方法:1.对于未使用GTID的复制,可以使用sql_slave_skip_counter来跳过错误2.对于使用GTID的复制,可以使用GTID_NEXT模拟空事务来 ...
- 【甘道夫】MapReduce实现矩阵乘法--实现代码
之前写了一篇分析MapReduce实现矩阵乘法算法的文章: [甘道夫]Mapreduce实现矩阵乘法的算法思路 为了让大家更直观的了解程序运行,今天编写了实现代码供大家參考. 编程环境: java v ...
- 对象的释放Dispose和Close对比
C#内存释放的几个方法对比: 而Close与Dispose这两种方法的区别在于,调用完了对象的Close方法后,此对象有可能被重新进行使用:而Dispose方法来说,此对象所占有的资源需要被标记为无用 ...
- MySQL创建表,更新表,删除表,重命名表
创建表 mysql> create table 表名( -> 列名 数据类型 是否为空 auto_increment, -> 列名 数据类型 是否为空... -> ... -& ...
- Update 20180317
Date todo 20180317 Opencv a) Install opencv+python+ide (http://opencv-python-tutroals.readth ...
- 负载均衡器 Ribbion
一.客户端负载均衡器 Ribbon 客户端向服务器如Eureka Server拉取已经注册的服务信息,然后根据负载均衡策略, 直接命中哪一台服务器发送请求. 整个过程在客户端完成,不需要服务器的参与. ...