Boost.Asio是一个异步编程的网络框架, 核心的优势在于IO操作的异步调用. 异步调用时, 会用到boost::asio::io_context::run()函数, 这个函数表示启动一个IO的异步循环, 与该io_context有关的回调函数, 会在该io_context所在的线程中运行, 举个代码的例子:

#include <boost/asio.hpp>
#include <iostream>
#include <chrono>
#include <string>
#include <thread>int main() {std::string raw_ip_addr = "127.0.0.1";unsigned int port = 6768;boost::asio::ip::tcp::endpoint ep(boost::asio::ip::address::from_string(raw_ip_addr),port);boost::asio::io_context ioc1, ioc2;boost::asio::ip::tcp::socket sock1(ioc1, ep.protocol()), sock2(ioc2, ep.protocol());sock1.async_connect(ep, [](const boost::system::system_error &ec) {std::cout << "sock1 async_connect, thread id: " << std::this_thread::get_id() << "\n";if (ec.code()) {std::cout << ec.what() << std::endl;}});sock2.async_connect(ep, [](const boost::system::system_error &ec) {std::cout << "sock2 async_connect, thread id: " << std::this_thread::get_id() << "\n";if (ec.code()) {std::cout << ec.what() << std::endl;}});std::this_thread::sleep_for(std::chrono::seconds(1));std::thread t1([&ioc1](){try {ioc1.run();} catch (boost::system::system_error& e) {std::cout << "Error :" << e.what() << std::endl;}});std::thread t2([&ioc2](){try {ioc2.run();} catch (boost::system::system_error& e) {std::cout << "Error :" << e.what() << std::endl;}});std::this_thread::sleep_for(std::chrono::milliseconds(100));t1.join();t2.join();return 0;
}

一种可能的输出结果:

sock1 async_connect, thread id: 139979035465472
Connection refused
sock2 async_connect, thread id: 139979027072768
Connection refused

可以明显看出, 是两个不同的事件循环, 运行在不同的线程中.

因此得出的结论是, boost::asio::io_context::run()表示一个异步的事件循环, 使用同一个io_contex的读写对象, 那么异步操作会在同一个线程中按照IO完成的先后顺序执行, io_context::run()表示启动事件循环, 之后发生io完成回调便会执行. 在实际的编程中, 只需要在不同的线程执行run()函数, 那么事件就会在指定的线程执行.

对Boost.Asio中异步事件循环的理解相关推荐

  1. boost::asio::io_context的事件循环

    简介 boost::asio::io_context看字面意思是io的上下文, 可以理解为, boost的任何io都会涉及到一个io_context, 同步io会隐式地启动一个io_context, ...

  2. boost::asio中文文档

    Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_ ...

  3. 浏览器中的事件循环机制

    浏览器中的事件循环机制 网上一搜事件循环, 很多文章标题的前面会加上 JavaScript, 但是我觉得事件循环机制跟 JavaScript 没什么关系, JavaScript 只是一门解释型语言, ...

  4. php循环套循环_PHP中的事件循环简介

    php循环套循环 PHP developers are always waiting for something. Sometimes we're waiting for requests to re ...

  5. Boost中的协程—Boost.Asio中的coroutine类

    Boost.Asio中有两处涉及协程,本文介绍其中的coroutine类. Boost.Asio中的stackless协程是由coroutine类和一些宏来实现的.coroutine类非常简单,包括四 ...

  6. 5.node.js中的事件循环

    先举一个简单的例子 const bar = () => console.log('bar')const baz = () => console.log('baz')const foo = ...

  7. 12.在JavaScript中的事件模型如何理解?

    一.事件与事件流 javascript中的事件,可以理解就是在HTML文档或者浏览器中发生的一种交互操作,使得网页具备互动性, 常见的有加载事件.鼠标事件.自定义事件等 由于DOM是一个树结构,如果在 ...

  8. js中如何得到循环中的点击的这个id_Js篇面试题9请说一下Js中的事件循环机制

    虽互不曾谋面,但希望能和您成为笔尖下的朋友 以读书,技术,生活为主,偶尔撒点鸡汤 不作,不敷衍,意在真诚吐露,用心分享 点击左上方,可关注本刊 标星公众号(ID:itclanCoder) 如果不知道如 ...

  9. JavaScipt 中的事件循环(event loop),以及微任务 和宏任务的概念

    说事件循环(event loop)之前先要搞清楚几个问题. 1. js为什么是单线程的? 试想一下,如果js不是单线程的,同时有两个方法作用dom,一个删除,一个修改,那么这时候浏览器该听谁的? 2. ...

最新文章

  1. 《SQL Server 管理与维护指南》章节目录
  2. hwclock date
  3. PowerShell图形化编程1-原理
  4. 分享一下cookies操作(增、删、改、查)小经验
  5. html5手机网站照片查看器,HTMLayout仿Picasa照片查看器效果
  6. linux+nginx+mysql+php系统修改文件上传大小限制
  7. 奥特曼系列ol服务器名称带怪兽,《奥特曼系列ol》怪兽图鉴 怪兽阵容
  8. java xml opencv_Java中使用opencv
  9. numpy 中对axis参数的理解
  10. 为应用程序池**提供服务的进程意外终止。进程ID是**。进程退出代码是'0x80'
  11. install opencv debian env
  12. 莫兰迪紫rgb_莫兰迪色系颜色大全 莫兰迪色系适合什么人
  13. python调用大漠插件寻路_python调用大漠插件或天使插件
  14. 字符串String实战之商品对象缓存管理之新增与获取详情
  15. 【口诀】巧记泰勒公式
  16. 【Android游戏开发详细过程1】Android平台飞机大战游戏APP设计与实现
  17. linux下Umail服务的停止
  18. 题解 CF1389B 【Array Walk】
  19. Android Studio 实现九宫格
  20. better-scroll内pullingUp无效(控制台报错)

热门文章

  1. 力扣 剑指 Offer 10- I. 斐波那契数列
  2. Python考试基础知识
  3. #C语言#重定义问题
  4. 不在一个局域网下,如何设置可以被远程登录的服务器[ubuntu]?【ssh登录】【不使用软件】
  5. C#中的Invoke和BeginInvoke
  6. 剑指offer——29.顺时针打印矩阵(不熟)
  7. 剑指offer——8.二叉树的下一个节点
  8. Spring beans配置方案(一) 学习笔记
  9. Bug错误一:报this.setData is not a function错误
  10. Easyui 弹出加载中的遮罩的两种方法