//有个疑惑: 向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. Is this Sentence Difficult? Do you Agree? -paper

    术语: 数据lemma:词根,词元(词的基本形式,如名词单数或动词的不定式形式) content words:实词part-of-speech:词性object-relative clauses an ...

  2. C语言-第一周作业

    要求1: 请在你的PC或者移动设备上安装词典,该词典工具能对计算机术语进行翻译.需要在你的博客中给出安装软件的截图,请确保阅读者能从截图判断出你的被安装的设备是PC或者移动设备.(5经验值) 要求2: ...

  3. nginx根据url中的参数进行转发

    在实际项目中,由于https安全策略,我们无法直接跳转到我们想要跳转到的地址 例如 url:https://abc.dc.com/image?url=https://vpic.video.qq.com ...

  4. PHP5和PHP7的安装、PHP和apache的整合!

    1.PHP5的安装: 下载: wget -c http://cn2.php.net/distributions/php-5.6.36.tar.gz  (php5) wget -c http://cn2 ...

  5. python绝对路径相对路径函数

    绝对路径 os.path.abspath("文件名")  参数可为“”即当前路径 相对路径 os.path.dirname("文件名")   参数可为“”即当前 ...

  6. web项目【3】

    前端代码: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.a ...

  7. sqlyog数据库管理软件下载

    下载安装包 一路next 链接:https://pan.baidu.com/s/1tdIwtYEW11MNWk--Hqd3dw 提取码:0ffp 复制这段内容后打开百度网盘手机App,操作更方便哦 然 ...

  8. nuxt docker 运行

    nuxt 是vue 版的next ,实现的功能还是很方便的,对于需要开发性能要求比较高的web app 是一个很不错的选择 备注: 项目很简单,使用docker && docker-c ...

  9. 你不知道的JavaScript(中卷) (Kyle Simpson 著)

    第一部分 类型和语法 第1章 类型 1.1 类型 1.2 内置类型 1.3 值和类型 1.3.1 undefined和undeclared 1.3.2 typeof Undeclared 1.4 小结 ...

  10. 一、搭建Django,建立第一个demo

    一. 1.安装好Python(我用的最新版2.7.15),配置环境变量,并且安装好对应的Django版本(pip install django),在Python安装目录下的Scropts下会多出dja ...