C++ Boost库 asio同步/异步模式[ 定时器来体现 ] [大三四八九月实习]
来源:互联网 发布:淘宝会员吸纳打标 编辑:程序博客网 时间:2024/05/22 00:49
1.机制分析
asio封装了操作系统的select、poll/epoll、kqueue、overlapped 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同步和异步的例子后的图标[ 乱 ]
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步骤中描述的一样。且看看运行结果验证一下某些结论:
图2 异步模式下运行结果
- 根据程序运行结果,可以有以下结论:回调函数会阻塞io_s.run()后面代码的运行。
- 第2行字符串的输出不会受到定时器的制约,在第一行输出后第二行就输出了[ 第一行的输出是调用的定时器的一个成员函数,输出的内容是此定时器定时的终值。如果是同步模式,则第2行语句会在定时器定时完毕后再输出 ]
此次笔记记录完毕。
- C++ Boost库 asio同步/异步模式[ 定时器来体现 ] [大三四八九月实习]
- C++ Boost asio库网络通信 [同/异步] [大三四八九月实习]
- C++ Boost库 asio同步/异步模式[ 定时器来体现 ]
- C++ Boost库 asio同步/异步模式[ 定时器来体现 ] 笔记
- C++ boost::asio::serial_port 串口通信类 使用 封装 [大三四八九月实习]
- BOOST timer库应用[timer库1] [大三四八九月实习]
- boost 库 timer组件的源码分析 [大三四八九月实习]
- BOOST 库 thread类线程使用 [大三四八九月实习]
- C++ BOOST库 条件变量[多线程通信]机制 [大三四八九月实习]
- boost库 bind/function的使用 [大三四八九月实习]
- Debian Linux字符界面 Boost 库下载 使用 [大三四八九月实习]
- 多线程执行 [大三四八九月实习]
- 第一个月实习总结 [大三四八九月实习]
- 第二月实习总结 [大三四八九月实习]
- BOOST 在windows的编译及配置(VS2010) [大三四八九月实习]
- 实习中的一总结 [大三四八九月实习]
- [Math] 排列组合 笔记 [大三四八九月实习]
- 排列组合应用于计数的思路 [大三四八九月实习]
- Win7卸载了FrameWork4.0后,再重装Framework4.0,vs2010显示“此计算机上没有安装.NETFramework,Version=v4.0”
- 睡觉睡硬床板的好处
- 第三方过滤器在TVideoGrabber中的使用
- .NET下 webdriver的基本操作总结
- hdu 1159 Common Subsequence
- C++ Boost库 asio同步/异步模式[ 定时器来体现 ] [大三四八九月实习]
- mysql alter语句增加一列
- 黑马程序员——面试重点之内存泄露
- hibernate4.2.4之环境搭建与测试实例
- 《JAVA课程设计》笔记-四章
- HTTP深入浅出 http请求
- POJ--3250 -- Bad Hair Day [栈模拟]
- WPF 数据绑定详解。。。
- webbrowser相关操作大全-1-----WebBrowser的方法、属性、事件