原文  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. Excel函数之vlookup的用法

    Vlookup函数用法: 实例: 要将编号对照表中的图书名称根据两表中的图书编码字段引入 订单明细中. Vlookup函数 参数一:键入一个需要搜索的字段,这里需要通过订单明细中的图书编号在编号对照离 ...

  2. React.js 学习总结

    1.用React的优越性 独立,小巧,快速 ReactDOM 会构建一个虚拟的DOM tree, 只有DOM tree 的某个部分发生变化,便重新渲染某个部分. React 判断DOM 是否重新渲染的 ...

  3. k8s学习笔记之二:使用kubeadm安装k8s集群

    一.集群环境信息及安装前准备 部署前操作(集群内所有主机): .关闭防火墙,关闭selinux(生产环境按需关闭或打开) .同步服务器时间,选择公网ntpd服务器或者自建ntpd服务器 .关闭swap ...

  4. Python(算法)-时间复杂度和空间复杂度

    时间复杂度 算法的时间复杂度是一个函数,它定量描述了该算法的运行时间,时间复杂度常用“O”表述,使用这种方式时,时间复杂度可被称为是渐近的,它考察当输入值大小趋近无穷时的情况 时间复杂度是用来估计算法 ...

  5. python函数作用域,嵌套函数,闭包

    函数作用域                                                                                                ...

  6. leetcode155

    public class MinStack { Stack<int> S = new Stack<int>(); /** initialize your data struct ...

  7. git 提交小备注

    总结: ·  git add -A  提交所有变化 ·  git add -u  提交被修改(modified)和被删除(deleted)文件,不包括新文件(new) ·  git add .  提交 ...

  8. Java中锁的实现与内存语义

    目录 1. 概述 2. 锁的内存语义 3. 锁内存语义的实现 4. 总结 1. 概述 锁在实际使用时只是明白锁限制了并发访问, 但是锁是如何实现并发访问的, 同学们可能不太清楚, 下面这篇文章就来揭开 ...

  9. json 异常

    com.google.gson.JsonSyntaxException: 1530842820000 1530842820000 是服务器直接返回的Date值由 Gson 解析后出来的值. 后台发出: ...

  10. Hibernate 再接触 总结