原文  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的基础的更多相关文章

  1. boost asio 学习(六) 定时器

    http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting- started-with-boostasio?pg=7 6 定时器 ...

  2. boost::asio学习(定时器)

    #include <boost/asio.hpp> #include <iostream> void handle1(const boost::system::error_co ...

  3. boost asio 学习(八) 网络基础 二进制写发送和接收

    http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting- started-with-boostasio?pg=9 8. Net ...

  4. boost asio 学习(七) 网络基础 连接器和接收器(TCP示例)

    http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting- started-with-boostasio?pg=8 7. Net ...

  5. boost asio 学习(九) boost::asio 网络封装

    http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting- started-with-boostasio?pg=10 9. A ...

  6. boost asio 学习(三)post与dispatch

    http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting-started-with-boostasio?pg=4 本章节为io_ ...

  7. BOOST ASIO 学习专贴

    本文已于20170903更新完毕,所有boost asio 代码均为本人手抄.编译器为vs2013,并且所有代码已经上传,本文下方可下载源码 为了学习boost asio库,我是从boost的官方bo ...

  8. boost::asio 学习

    安装 下载-解压 指定安装目录 ./bootstrap.sh --prefix=/usr/local/boost_1_68_0 查看所有必须要编译才能使用的库 ./b2 --show-librarie ...

  9. boost asio 学习(五) 错误处理

    http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting-started-with-boostasio?pg=6 5. Erro ...

随机推荐

  1. 关于rtsp的时间戳问题

    这里主要关注的rtp包的时间戳,在rtsp中,播放器的1S钟的定义是和媒体的采样率有关的. 例如视频的采样率是90K,那么最小时间粒度(单位)是1/90000秒,再转换成ms就是 1/90毫秒,这个就 ...

  2. vue 项目全局修改element-ui的样式

    引入了element-ui,但是和我们自己的样式颜色有很大的不同, 修改例子:在src文件下创建 element-var.scss,代码如下 $--color-primary: yellow;  /* ...

  3. SpringBoot Web开发(3) WebMvcConfigurerAdapter过期替代方案

    springboot2.0中 WebMvcConfigurerAdapter过期替代方案 最近在学习尚硅谷的<springboot核心技术篇>,项目中用到SpringMVC的自动配置和扩展 ...

  4. springJdbc(jdbcTemplate)事物拦截失效问题解决

    先贴上web.xml和spring-jdbc.xml代码: web.xml代码: <context-param> <param-name>contextConfigLocati ...

  5. 把已经安装到C盘的软件完美移动到D盘

    背景信息 今天早上在安装软件的时候发现C盘爆满,只剩下最后10G了.而我要安装的玩意儿必须装到C盘. 靠清理垃圾文件来解决并不是一个好方法,实际上通常垃圾文件占用很少,而且就算清理了,也还会再出现. ...

  6. Struts2 <s:select >标签的使用

    select 取值session中的内容 <s:select name="meal.mealseries.seriesid" list="#session.meal ...

  7. SpringBoot,SpringCloud入门到精通最简单教程

    https://blog.csdn.net/ztx114/article/details/78091689

  8. linux环境下载和安装scala

    Linux下安装Scala和Windows下安装类似,步骤如下: 1.首先访问下载链接:http://www.scala-lang.org/download/默认这里下载的是Windows版本,这时点 ...

  9. Dubbo注册Zookepper服务的虚拟IP

    使用dubbo在zookepper上注册服务,使用dubbo的服务器IP为192.168.70.105 而在zookepper上显示服务提供者为 dubbo://202.102.110.203:808 ...

  10. http 文件上传协议图览