对Boost.Asio中异步事件循环的理解
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中异步事件循环的理解相关推荐
- boost::asio::io_context的事件循环
简介 boost::asio::io_context看字面意思是io的上下文, 可以理解为, boost的任何io都会涉及到一个io_context, 同步io会隐式地启动一个io_context, ...
- boost::asio中文文档
Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_ ...
- 浏览器中的事件循环机制
浏览器中的事件循环机制 网上一搜事件循环, 很多文章标题的前面会加上 JavaScript, 但是我觉得事件循环机制跟 JavaScript 没什么关系, JavaScript 只是一门解释型语言, ...
- php循环套循环_PHP中的事件循环简介
php循环套循环 PHP developers are always waiting for something. Sometimes we're waiting for requests to re ...
- Boost中的协程—Boost.Asio中的coroutine类
Boost.Asio中有两处涉及协程,本文介绍其中的coroutine类. Boost.Asio中的stackless协程是由coroutine类和一些宏来实现的.coroutine类非常简单,包括四 ...
- 5.node.js中的事件循环
先举一个简单的例子 const bar = () => console.log('bar')const baz = () => console.log('baz')const foo = ...
- 12.在JavaScript中的事件模型如何理解?
一.事件与事件流 javascript中的事件,可以理解就是在HTML文档或者浏览器中发生的一种交互操作,使得网页具备互动性, 常见的有加载事件.鼠标事件.自定义事件等 由于DOM是一个树结构,如果在 ...
- js中如何得到循环中的点击的这个id_Js篇面试题9请说一下Js中的事件循环机制
虽互不曾谋面,但希望能和您成为笔尖下的朋友 以读书,技术,生活为主,偶尔撒点鸡汤 不作,不敷衍,意在真诚吐露,用心分享 点击左上方,可关注本刊 标星公众号(ID:itclanCoder) 如果不知道如 ...
- JavaScipt 中的事件循环(event loop),以及微任务 和宏任务的概念
说事件循环(event loop)之前先要搞清楚几个问题. 1. js为什么是单线程的? 试想一下,如果js不是单线程的,同时有两个方法作用dom,一个删除,一个修改,那么这时候浏览器该听谁的? 2. ...
最新文章
- 《SQL Server 管理与维护指南》章节目录
- hwclock date
- PowerShell图形化编程1-原理
- 分享一下cookies操作(增、删、改、查)小经验
- html5手机网站照片查看器,HTMLayout仿Picasa照片查看器效果
- linux+nginx+mysql+php系统修改文件上传大小限制
- 奥特曼系列ol服务器名称带怪兽,《奥特曼系列ol》怪兽图鉴 怪兽阵容
- java xml opencv_Java中使用opencv
- numpy 中对axis参数的理解
- 为应用程序池**提供服务的进程意外终止。进程ID是**。进程退出代码是'0x80'
- install opencv debian env
- 莫兰迪紫rgb_莫兰迪色系颜色大全 莫兰迪色系适合什么人
- python调用大漠插件寻路_python调用大漠插件或天使插件
- 字符串String实战之商品对象缓存管理之新增与获取详情
- 【口诀】巧记泰勒公式
- 【Android游戏开发详细过程1】Android平台飞机大战游戏APP设计与实现
- linux下Umail服务的停止
- 题解 CF1389B 【Array Walk】
- Android Studio 实现九宫格
- better-scroll内pullingUp无效(控制台报错)
热门文章
- 力扣 剑指 Offer 10- I. 斐波那契数列
- Python考试基础知识
- #C语言#重定义问题
- 不在一个局域网下,如何设置可以被远程登录的服务器[ubuntu]?【ssh登录】【不使用软件】
- C#中的Invoke和BeginInvoke
- 剑指offer——29.顺时针打印矩阵(不熟)
- 剑指offer——8.二叉树的下一个节点
- Spring beans配置方案(一) 学习笔记
- Bug错误一:报this.setData is not a function错误
- Easyui 弹出加载中的遮罩的两种方法