C++ Boost库 asio同步/异步模式[ 定时器来体现 ] 笔记
2013-12-10 14:26
190 查看
此文转自:http://blog.csdn.net/misskissC/article/details/9963515
I/O众多机制,实现了异步I/O模式。
asio库使用了大量的类和函数封装了socket
API,提供了一个现代风格C++网络编程接口,支持TCP、ICMP、UDP等网络通信协议。asio库还支持串口读写、定时器、SSL等功能,而且asio还是一个富有弹性的框架。
核心类
io_service,asio的任何操作都有io_service的参与,io_service用于提交io请求并获取操作系统对io处理后的结果。
使用asio库程序的基本结构和流程:
1.定义一个io_service对象
io_s;
2.定义asio库内具体的对象a_object[以上提到的定时器、串口读写等组件
],并将io_service对象传入此对象的构造函数中。
3.调用a_object的成员函数,有的函数(如同步模式:wait(),异步模式:async_wait())会决定io_service是在同步还是异步模式下工作。如果调用异步模式下的函数,则要将函数作为异步模式函数的参数注册。
4.如果是采取了异步模式,则在不想被回调函数阻塞运行的代码后一定要调用io_service::run()函数,否则经注册的回调函数得不到执行
一个分析简单使用asio同步和异步的例子后的图标[ 乱 ]
![](https://img-blog.csdn.net/20130814140438609?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWlzc2tpc3ND/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
asio同步/异步机制分析图书
//避免VC下的警告
#ifdef _MSC_VER
#define _WIN32_WINNT 0X0501
#endif
#define BOOST_REGEX_NO_LIB
#define BOOST_DATE_TIME_SOURCE
#define BOOST_SYSTEM_NO_LIB
#include <boost/asio.hpp>
using namespace boost::asio;
此段代码跟使用asio步骤中描述的一样。且看看运行结果验证一下某些结论:
![](https://img-blog.csdn.net/20130814141601921?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWlzc2tpc3ND/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
[align=left] [/align]
图2 异步模式下运行结果
[align=left]根据程序运行结果,可以有以下结论:回调函数会阻塞io_s.run()后面代码的运行。[/align]
[align=left]第2行字符串的输出不会受到定时器的制约,在第一行输出后第二行就输出了[ 第一行的输出是调用的定时器的一个成员函数,输出的内容是此定时器定时的终值。如果是同步模式,则第2行语句会在定时器定时完毕后再输出 ] [/align]
此次笔记记录完毕。
1.机制分析
asio封装了操作系统的select、poll/epoll、kqueue、overlappedI/O众多机制,实现了异步I/O模式。
asio库使用了大量的类和函数封装了socket
API,提供了一个现代风格C++网络编程接口,支持TCP、ICMP、UDP等网络通信协议。asio库还支持串口读写、定时器、SSL等功能,而且asio还是一个富有弹性的框架。
核心类
io_service,asio的任何操作都有io_service的参与,io_service用于提交io请求并获取操作系统对io处理后的结果。
使用asio库程序的基本结构和流程:
1.定义一个io_service对象
io_s;
2.定义asio库内具体的对象a_object[以上提到的定时器、串口读写等组件
],并将io_service对象传入此对象的构造函数中。
3.调用a_object的成员函数,有的函数(如同步模式:wait(),异步模式:async_wait())会决定io_service是在同步还是异步模式下工作。如果调用异步模式下的函数,则要将函数作为异步模式函数的参数注册。
4.如果是采取了异步模式,则在不想被回调函数阻塞运行的代码后一定要调用io_service::run()函数,否则经注册的回调函数得不到执行
一个分析简单使用asio同步和异步的例子后的图标[ 乱 ]
asio同步/异步机制分析图书
2 一个简单的异步模式的例子
(1)vs2010 使用C++ boost库的asio
需要首先包含以下内容[ 若果要在vs2010下使用C++其它内容,则按照对应内容需求包含 ]//避免VC下的警告
#ifdef _MSC_VER
#define _WIN32_WINNT 0X0501
#endif
#define BOOST_REGEX_NO_LIB
#define BOOST_DATE_TIME_SOURCE
#define BOOST_SYSTEM_NO_LIB
#include <boost/asio.hpp>
using namespace boost::asio;
(2)代码
建立一个vs2010的控制台程序,在主程序中在(1)后面追加以下代码#include "stdafx.h" #include <iostream> #include <boost/asio.hpp> #include <boost/date_time/posix_time/posix_time.hpp> using namespace std; using namespace boost; using namespace boost::asio; //函数声明 void print( const boost::system::error_code &ec ); int _tmain(int argc, _TCHAR* argv[]) { io_service io_s; deadline_timer d_t( io_s, posix_time::seconds(1) ); cout << d_t.expires_at() << "\n"; d_t.async_wait( print ); cout << "\n定时继续,我输出"; io_s.run(); cout << "\n回调函数和程序中的代码谁先运行"; getchar(); return 0; } //回调函数 void print( const boost::system::error_code &ec ) { cout << "\n定时结束"; }
此段代码跟使用asio步骤中描述的一样。且看看运行结果验证一下某些结论:
[align=left] [/align]
图2 异步模式下运行结果
[align=left]根据程序运行结果,可以有以下结论:回调函数会阻塞io_s.run()后面代码的运行。[/align]
[align=left]第2行字符串的输出不会受到定时器的制约,在第一行输出后第二行就输出了[ 第一行的输出是调用的定时器的一个成员函数,输出的内容是此定时器定时的终值。如果是同步模式,则第2行语句会在定时器定时完毕后再输出 ] [/align]
此次笔记记录完毕。
相关文章推荐
- C++ Boost库 asio同步/异步模式[ 定时器来体现 ] [大三四八九月实习]
- C++ Boost库 asio同步/异步模式[ 定时器来体现 ]
- 【08】 Boost库学习笔记之定时器(Timer)
- c++的boost库学习笔记
- C++ Boost库 uBLAS 笔记
- c++模板笔记(2)
- 2012/1/8 《C++ Primer Plus》第二章:开始学习C++ 学习笔记
- C/C++学习笔记1
- C++代码笔记(1)string搜索操作——find()
- C/C++学习笔记5-栈的工作流程
- C++面向对象编程笔记(二)
- C++学习笔记--默认参数和函数重载不可以同时存在
- C++学习笔记(三十)建造者模式
- C++MFC编程笔记day06 MFC向导、MFC绘图类使用
- C++学习笔记(六)----关于顺序容器
- &lt;More Effective C++&gt;笔记--运算符
- [c/c++]笔记-联合体
- 设计模式C++学习笔记之十四(Iterator迭代器模式)
- CLR 与 C++的常用类型转换笔记
- C++学习笔记之对文件的操作<1>