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
=================================版权声明================================= 版权声明:原创文章 谢绝转载 啥说的,鄙视那些无视版权随 ...
随机推荐
- dfs——皇后问题(回溯)
#include <iostream> using namespace std; ],b[],c[],d[]; ; dfs(int i) { if(i>n) { sum++; ) { ...
- active在iphone上不起作用
在js中加一个空的touchstart函数 $(function(){ document.body.addEventListener('touchstart',function(){ }); 或在&l ...
- 02 http,servlet,servletconfig,HttpServletRequest ,HttpServletResponse
Http协议 协议:双方在交互.通讯的时候, 遵守的一种规范.规则.http协议:针对网络上的客户端 与 服务器端在执行http请求的时候,遵守的一种规范. 其实就是规定了客户端在访问服务器端的时候, ...
- 我的TDD实践---TDD概念篇
“我的TDD实践”系列之TDD概念篇 写在前面: 我的TDD实践这几篇文章主要是围绕测试驱动开发所展开的,其中涵盖了一小部分测试理论,更多的则是关注工具的使用及环境的搭建,做到简单实践先行,后理论专精 ...
- PyMongo 常见问题
PyMongo是线程安全的吗PyMongo是线程安全的,并且为多线程应用提供了内置的连接池 PyMongo是进程安全的吗PyMongo不是进程安全的,如果你在fork()中使用MongoClient实 ...
- <---------------线程修改名字、得到名字及开启------------------>
ThreadDemo: public class ThreadDemo extends Thread { public void run(){ System.out.println(getName() ...
- sqler sql 转rest api 授权处理
我们可以使用内置的authorizer 以及js 脚本,方便的进行api 接口的授权处理 说明: 这个是2.0 的功能,注意版本的使用 参考格式 addpost { authorizer = & ...
- apache geode 试用
使用docker 运行,文档参考的官方的5 分钟学习文档 拉取镜像 docker pull apachegeode/geode 启动 docker run -it -p 10334:10334 -p ...
- ML(附录2)——最小二乘法
参见 :多变量微积分笔记2——最小二乘法
- C# 泛型类和泛型方法
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...