boost asio 学习(一)io_service的基础
原文 http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting-
started-with-boostasio/
编译环境 boost1.59 vs2015
/**************************************************************技术博客http://www.cnblogs.com/itdef/技术交流群群号码:324164944欢迎c c++ windows驱动爱好者 服务器程序员沟通交流**************************************************************/A guide to getting started with boost::asio
boost asio 学习指南
boost::asio是一个使用现代C++方法为开发者提供异步模型的跨平台的c++网络和
底层IO库.目前已经拥有大量用户并成为boost库的一部分
在开始之前,我们将浏览下boost::asio综述。它包括了很多我们必须知道的基本
信息。指南不会涉及整个boost库的复杂细节,他将指导我们学习如何在我们的程
序中使用ASIO。
本指南不会教授任何编程语言。读者必须熟悉C++并且熟练使用boost库,尤其是
ASIO库。指南也不会教授网络编程。换句话说,本指南的目标是指导读者使用
asio,但是依旧需要读者花费时间读取官方文档。
本指南示例是在windows下编译。如果代码需要移植,可能需要做一些逻辑上的改
变。所有代码已经压缩并上传,没有包含工程文件,仅包含源码文件。代码依赖
BOOST库。
1 io_service的基础
boost::asio的核心对象就是io_service.此对象类似于库的大脑和心脏。我们使
用一个简单的示例来熟悉它,调用run成员函数。run函数将阻塞直到所有任务完成
并且没有任何处理器被分发,或者直到io_service被停止。
代码示例1a
#include <boost/asio.hpp>
#include <iostream> int main( int argc, char * argv[] )
{
boost::asio::io_service io_service; io_service.run(); std::cout << "Do you reckon this line displays?" << std::endl; return 0;
}
以下示例创建一个work类。work类在有任务运行时通知io_service。换句话说,
当io_service有一个任务对象与其关联,它将不会停止运行。下个示例验证这个
说法。
代码示例1b
#include <boost/asio.hpp>
#include <iostream> int main( int argc, char * argv[] )
{
boost::asio::io_service io_service;
boost::asio::io_service::work work( io_service ); io_service.run(); std::cout << "Do you reckon this line displays?" << std::endl; return 0;
}
我们运行示例代码将得到预期的效果。我们并没有看到文本的输出并且程序没有
退出。在我们熟悉ASIO之后再优化如何优雅退出程序。
下个例子中,我们将简单的模拟一个循环并且呼叫io_service的poll函数。poll
函数是用来运行io_service对象事件循环处理并执行准备好的处理器。
示例1c
#include <boost/asio.hpp>
#include <iostream> int main( int argc, char * argv[] )
{
boost::asio::io_service io_service; for( int x = 0; x < 42; ++x )
{
io_service.poll();
std::cout << "Counter: " << x << std::endl;
} return 0;
}
运行这个示例,我们将看见42行的文本输出并且程序将退出。如果我们有一个指
定给io_service的work对象,是否有不同?
示例1d
#include <boost/asio.hpp>
#include <iostream> int main( int argc, char * argv[] )
{
boost::asio::io_service io_service;
boost::asio::io_service::work work( io_service ); for( int x = 0; x < 42; ++x )
{
io_service.poll();
std::cout << "Counter: " << x << std::endl;
} return 0;
}
运行这个示例,我们获得之前同样的输出。因为poll函数在没有任务运行时候不
会阻塞。poll函数简单执行当前任务组并且返回。
选择poll函数或者run函数取决于函数的设置。这些函数带来更多的兼容性,程序
员可以更好的调整程序。run函数将阻塞并等待任务,poll函数则不。
如果我们想从io_service移除一个work对象。通过查看文档,没有函数提供此种
功能。为了实现此种功能,我们必须使用work对象的智能指针。
示例代码1e
#include <boost/asio.hpp>
#include <boost/shared_ptr.hpp>
#include <iostream> int main( int argc, char * argv[] )
{
boost::asio::io_service io_service;
boost::shared_ptr< boost::asio::io_service::work > work(
new boost::asio::io_service::work( io_service )
); work.reset(); io_service.run(); std::cout << "Do you reckon this line displays?" << std::endl; return 0;
}
程序显示如何让从io_service移除work对象,这个功能对于我们优雅的关闭一个挂起的任务很重要。
多线程下呼叫run函数设置执行处理器的线程池。池中等待的线程是同等优先级,io_service随机选择一个触发处理器。
示例代码1f
#include <boost/asio.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/thread.hpp>
#include <iostream> boost::asio::io_service io_service; void WorkerThread()
{
std::cout << "Thread Start\n";
io_service.run();
std::cout << "Thread Finish\n";
} int main( int argc, char * argv[] )
{
boost::shared_ptr< boost::asio::io_service::work > work(
new boost::asio::io_service::work( io_service )
); std::cout << "Press [return] to exit." << std::endl; boost::thread_group worker_threads;
for( int x = 0; x < 4; ++x )
{
worker_threads.create_thread( WorkerThread );
} std::cin.get(); io_service.stop(); worker_threads.join_all(); return 0;
}
示例介绍stop成员函数。stop成员函数将发信号给io_service,提示所有任务将停止。所以在当前任务结束后,不再有任务发起。示例中另一个变化就是io_service对象成为全局对象。运行程序后将有4个线程开始传输信息,并且在我们敲击回车后停止。
boost asio 学习(一)io_service的基础的更多相关文章
- boost asio 学习(六) 定时器
http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting- started-with-boostasio?pg=7 6 定时器 ...
- boost::asio学习(定时器)
#include <boost/asio.hpp> #include <iostream> void handle1(const boost::system::error_co ...
- boost asio 学习(八) 网络基础 二进制写发送和接收
http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting- started-with-boostasio?pg=9 8. Net ...
- boost asio 学习(七) 网络基础 连接器和接收器(TCP示例)
http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting- started-with-boostasio?pg=8 7. Net ...
- boost asio 学习(九) boost::asio 网络封装
http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting- started-with-boostasio?pg=10 9. A ...
- boost asio 学习(三)post与dispatch
http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting-started-with-boostasio?pg=4 本章节为io_ ...
- BOOST ASIO 学习专贴
本文已于20170903更新完毕,所有boost asio 代码均为本人手抄.编译器为vs2013,并且所有代码已经上传,本文下方可下载源码 为了学习boost asio库,我是从boost的官方bo ...
- boost::asio 学习
安装 下载-解压 指定安装目录 ./bootstrap.sh --prefix=/usr/local/boost_1_68_0 查看所有必须要编译才能使用的库 ./b2 --show-librarie ...
- boost asio 学习(五) 错误处理
http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting-started-with-boostasio?pg=6 5. Erro ...
随机推荐
- lavarel 中间件
创建中间件 php artisan make:policy UserPolicy 所有生成的授权策略文件都会被放置在 app/Policies 文件夹下. 让我们为默认生成的用户授权策略添加 upda ...
- 设置Tomcat管理员用户名和密码
http://dove19900520.iteye.com/blog/1774980 今天tomcat出点问题,然后我就想进入tomcat manager看看,结果怎么输入密码都不行,后来网上查了查才 ...
- 一些有用的Java学习资料
Better Java,一些好的Java实践 Google Java Style Guide 30个Java编程技巧 JDK8新增语法特性简介,对Java8中新增的函数接口.Lambda表达式.方法引 ...
- Ubuntu 14.10 下DokuWiki安装
环境说明: Ubuntu 14.10 64位 1 下载DokuWiki:http://download.dokuwiki.org/ 2 解压到 /var/www/html下面 3 如果没有安装Apac ...
- 并发之java.util.concurrent.atomic原子操作类包
15.JDK1.8的Java.util.concurrent.atomic包小结 14.Java中Atomic包的原理和分析 13.java.util.concurrent.atomic原子操作类包 ...
- impala daemon启动失败
启动错误日志: perl: warning: Setting locale failed. perl: warning: Please check that your locale settings: ...
- (整理)在REHL6.5上部署ASP.NET MVC
最近项目要使用Linux服务器(REHL6.5)+MySQL,因此特尝试操作. 1 Linux 安装Jexus 1.1 下载Jexus 因为服务器没有安装Xwindows,Jexus的下载又出现问题, ...
- kubernetes学习笔记之十:RBAC
第一章.RBAC介绍 在Kubernetes中,授权有ABAC(基于属性的访问控制).RBAC(基于角色的访问控制).Webhook.Node.AlwaysDeny(一直拒绝)和AlwaysAllow ...
- Action Form的过程
1.读取配置(初始化ModuleConfig对象) Struts框架总控制器(ActionServlet)是一个Servlet, 在web.xml中配置成自动启动的Servlet. 读取配置文件(st ...
- NodeJS client code websocket
var WebSocketClient = require('websocket').client; var client = new WebSocketClient(); client.on('co ...