Boost:asio单io_service,多线程run

news/2024/11/14 14:02:09/

io_service相当于注册异步回调的一个上下文环境,而run相当于处理异步io的上下文(通常是一个线程)。

单io_service,多线程run,相当于多个线程同时来处理注册在一个io_service上的回调:

//sio_mth.cpp
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time_types.hpp>
#include <iostream>
#include <chrono>
#include <thread>
#include <functional>
using namespace boost::asio;
using namespace std;thread_local int t_id = 0;
unsigned long getTimestamp()
{return std::chrono::system_clock::now().time_since_epoch().count()/std::chrono::system_clock::period::den;
}void timer_handler(int timerID, const boost::system::error_code& err)
{if (err){cout << getTimestamp() << " Timer cancel" << endl;return;}cout << getTimestamp() <<" t_id:" << t_id << " timerID:" << timerID << " " << " Timer on"<<endl;if(t_id == 1){this_thread::sleep_for(1s);}else{this_thread::sleep_for(3s);}
}void threadRunIO(int id, io_service* ios)
{t_id = id;ios->run();
}int main()
{io_service ios;cout << getTimestamp() << " Timer enable" << endl;deadline_timer t1(ios, boost::posix_time::seconds(2));deadline_timer t2(ios, boost::posix_time::seconds(2));deadline_timer t3(ios, boost::posix_time::seconds(2));deadline_timer t4(ios, boost::posix_time::seconds(2));deadline_timer t5(ios, boost::posix_time::seconds(2));deadline_timer t6(ios, boost::posix_time::seconds(2));t1.async_wait(bind(timer_handler, 1, std::placeholders::_1));t2.async_wait(bind(timer_handler, 2, std::placeholders::_1));t3.async_wait(bind(timer_handler, 3, std::placeholders::_1));t4.async_wait(bind(timer_handler, 4, std::placeholders::_1));t5.async_wait(bind(timer_handler, 5, std::placeholders::_1));t6.async_wait(bind(timer_handler, 6, std::placeholders::_1));thread th1(threadRunIO, 1, &ios);thread th2(threadRunIO, 2, &ios);th1.join();th2.join();cout << getTimestamp() << " exit" << endl;return 0;
}//g++ -o sm sio_mth.cpp

启动了两个线程来运行同一个io_service上的异步处理。

两个线程会根据调度来处理:

1701936688 Timer enable
1701936690 t_id:2 timerID:1  Timer on
1701936690 t_id:1 timerID:2  Timer on
1701936691 t_id:1 timerID:3  Timer on
1701936692 t_id:1 timerID:4  Timer on
1701936693 t_id:2 timerID:5  Timer on
1701936693 t_id:1 timerID:6  Timer on
1701936696 exit

可以看到线程2先处理了timerID:1

然后再次期间,线程1处理了timerID:2,timerID:3,timerID:4

之后线程2处理完了timerID:1后又开始处理timerID:5

线程1处理timerID:6

也就是会根据线程当前的忙闲情况,分配任务到线程


http://www.ppmy.cn/news/1261321.html

相关文章

【征稿倒计时十天】第三届高性能计算与通信工程国际学术会议(HPCCE 2023)

【有ISSN、ISBN号&#xff01;&#xff01;往届均已完成EI检索】 第三届高性能计算与通信工程国际学术会议(HPCCE 2023) 2023 3rd International Conference on High Performance Computing and Communication Engineering (HPCCE 2023) 2023年12月22-24日 | 中国哈尔滨 第三…

微信小程序 跳转界面,选择货物之后,返回上一页带参数并判断参数是否存在

需求 当刚进来时选择货物&#xff0c;跳转到选择货物界面进行货物选择&#xff0c;如果货物重复&#xff0c;不再新增货物&#xff0c;如果不存在&#xff0c;则新增 prevPage.setData()用于在页面之间传递数据。它将数据设置到上一个页面&#xff08;即prevPage&#xff09;的…

如何在报表工具 FastReport Cloud 中使用 ClickHouse

FastReport Cloud 是一项云服务 (SaaS)&#xff0c;旨在为您的企业存储、编辑、构建和发送报告。您的整个团队可以从世界任何地方访问这些报告&#xff0c;并且无需创建自己的应用程序。 FastReport Cloud 试用&#xff08;qun&#xff1a;585577353&#xff09;https://chat8.…

你了解架构图吗?

技术界的扛把子架构图&#xff0c;你了解吗&#xff1f;今天我们就来聊聊它 什么是架构图呢&#xff1f; 系统架构是概念的体现&#xff0c;是对物/信息的功能与形式元素之间的对应情况所做的分配&#xff0c;是对元素之间的关系以及元素同周边环境之间的关系所做的定义。 架构…

学习IO的第五天

作业 &#xff1a;使用两个线程完成文件的拷贝写入&#xff0c;分线程1写入前半段&#xff0c;分线程2写入后半段&#xff0c;主线程用来回收资源 #include <head.h>void *sork(void *arg); void *sork2(void *arg);int file_copy(int start,int len) //拷贝的函数 {i…

分数到小数

题目链接 分数到小数 题目描述 注意点 denominator ! 0对于所有给定的输入&#xff0c;保证 答案字符串的长度小于 10000如果小数部分为循环小数&#xff0c;则将循环的部分括在括号内 解答思路 本题关键是要找到循环小数的部分并将其两侧加上括号&#xff0c;模拟除法运算…

Echarts运用之饼状图常见问题及案例代码

前言 ECharts 是一个使用 JavaScript 实现的开源可视化库,它可以帮助用户以简单的方式创建复杂的时间序列、条形图、饼图、地图等图形。 初学者,可参考下我的另外两篇文章,从基础到深入,解读饼状图的运用。 ECharts初始案例(入门) ECharts之饼图 常见问题及案例代码 数…

数据清洗、特征工程和数据可视化、数据挖掘与建模的主要内容

1.4 数据清洗、特征工程和数据可视化、数据挖掘与建模的内容 视频为《Python数据科学应用从入门到精通》张甜 杨维忠 清华大学出版社一书的随书赠送视频讲解1.4节内容。本书已正式出版上市&#xff0c;当当、京东、淘宝等平台热销中&#xff0c;搜索书名即可。内容涵盖数据科学…