//有个疑惑: 向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类的更多相关文章

  1. boost::asio::io_service类

    大部分使用Boost.Asio编写的代码都会使用几个io_service的实例.io_service是这个库里面最重要的类:它负责和操作系统打交道,等待所有异步操作的结束,然后为每一个异步操作调用其完 ...

  2. C++ 异步编程:Boost.Asio

    Boost.Asio 是一个用于网络和低级 I/O 编程的跨平台 C++ 库,它使用现代 C++ 方法为开发人员提供一致的异步模型 一个异步使用计时器的样例 #include <iostream ...

  3. 使用Boost.Asio编写通信程序

    摘要:本文通过形像而活泼的语言简单地介绍了Boost::asio库的使用,作为asio的一个入门介绍是非常合适的,可以给人一种新鲜的感觉,同时也能让体验到asio的主要内容. Boost.Asio是一 ...

  4. Boost.Asio的使用技巧

    基本概念 Asio proactor I/O服务 work类 run() vs poll() stop() post() vs dispatch() buffer类 缓冲区管理 I/O对象 socke ...

  5. boost::asio::deadline_timer(理解)

    并发与并行: 并发和并行从宏观上来讲都是同时处理多路请求的概念.但并发和并行又有区别,并行是指两个或者多个事件在同一时刻发生:而并发是指两个或多个事件在同一时间间隔内发生. 1.Timer.1 - 使 ...

  6. boost asio中io_service类的几种使用

    io_service类 你应该已经发现大部分使用Boost.Asio编写的代码都会使用几个io_service的实例.io_service是这个库里面最重要的类:它负责和操作系统打交道,等待所有异步操 ...

  7. boost::asio::ip::tcp中几个重要类型

    typedef basic_stream_socket socket; 流式套接字,提供同/异步发送接收数据,连接,绑定,设置套接字选项等功能 对于socket中的connect()方法,它只针对某一 ...

  8. boost.asio新框架的设计概念总结

    1.66版本,boost.asio库重新设计了框架,目前最新版为1.71.读了几天代码后,对框架中相关概念总结.因为是泛型编程的库,所以分析的概念层的设计. 可通过boost官方文档,strand的1 ...

  9. BOOST.Asio——Overview

    =================================版权声明================================= 版权声明:原创文章 谢绝转载  啥说的,鄙视那些无视版权随 ...

随机推荐

  1. java一些必会算法

    经典算法的Java实现 (1)河内塔问题: 42 (2)费式数列 43 (3)巴斯卡(Pascal)三角形 44 (4)蒙地卡罗法求 PI 45 (5)最大公因数.最小公倍数 46 (6)阿姆斯壮数 ...

  2. n!的质因子分解

    其中k为任意质因子,因为a的数值不确定,所有k的值可以任意选择. 以下代码用于求出m!: #include<bits/stdc++.h> LL getpow(LL n,LL k) { LL ...

  3. Echarts全解注释

    coordinate-geo.js文件为地理坐标系的配置参数 mytextStyle={ color:"#333",//文字颜色 fontStyle:"normal&qu ...

  4. SQL Server 并发死锁解决案例备忘

    SET @sql = ' SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; SET DEADLOCK_PRIORITY 10 BEGIN TRAN DE ...

  5. 剑指offer-反向遍历链表-栈和递归2种方法(一次性跑通)

  6. Kettle入门--作业和转换的使用

    本来想在centos7下部署的,发现因为java版本的问题,无法成功部署,无奈,转到windows平台(后来找到解决方法了,在centos7系统下yum install webkitgtk* -y 就 ...

  7. linux http配置

    yum install httpd 安装http服务器 启动http服务器即可访问 如果不行的话,试着执行命令 firewall-cmd –permanent –add-service=http(该命 ...

  8. MySQL--数据库连接异常问题汇总

    ======================================================== Name or service not known 错误消息: [Warning] I ...

  9. 使用netstat、lsof查看端口占用情况

    netstat netstat用来查看系统当前系统网络状态信息,包括端口,连接情况等,常用方式如下:   netstat -atunlp,各参数含义如下:   -t : 指明显示TCP端口 -u : ...

  10. About the test in development

    Unit test: Specify and test one point of the contract of single method of a class. This should have ...