C++ Boost库 asio同步/异步模式[ 定时器来体现 ]

时间:2022-09-08 23:18:00

1.机制分析

asio封装了操作系统的selectpoll/epollkqueueoverlapped I/O众多机制,实现了异步I/O模式。

 

asio库使用了大量的类和函数封装了socket API,提供了一个现代风格C++网络编程接口,支持TCPICMPUDP等网络通信协议。asio库还支持串口读写、定时器SSL等功能,而且asio还是一个富有弹性的框架。

 

核心类

io_service,asio的任何操作都有io_service的参与,io_service用于提交io请求并获取操作系统对io处理后的结果。

 

使用asio库程序的基本结构和流程:

  • 1. 定义一个 io_service 对象  io _s;
  • 2. 定义 asio 库内具体的对象 a_object[ 以上提到的定时器、串口读写等组件  ] ,并将 i o_service 对象传入此对象的构造函数中。
  • 3. 调用 a_object 的成员函数,有的函数(如同步模式: wait() , 异步模式: async_wait() )会决定 io_service 是在同步还是异步模式下工作。如果调用异步模式下的函数,则要将函数作为异步模式函数的参数注册。
  • 4. 如果是采取了异步模式,则在不想被回调函数阻塞运行的代码后一定要调用 io_service::run() 函数,否则经注册的回调函数得不到执行

一个分析简单使用asio同步和异步的例子后的图标[ 乱 ]

C++ Boost库 asio同步/异步模式[ 定时器来体现 ]

2 一个简单的异步模式的例子

 

(1)vs2010 使用C++ boost库的asio

需要首先包含以下内容[ 若果要在vs2010下使用C++其它内容,则按照对应内容需求包含 ]

[cpp] view plaincopyprint?
//避免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)后面追加以下代码

[cpp] view plaincopyprint?
#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步骤中描述的一样。且看看运行结果验证一下某些结论:
C++ Boost库 asio同步/异步模式[ 定时器来体现 ]
  • 根据程序运行结果,可以有以下结论:回调函数会阻塞io_s.run()后面代码的运行。
  • 第2行字符串的输出不会受到定时器的制约,在第一行输出后第二行就输出了[ 第一行的输出是调用的定时器的一个成员函数,输出的内容是此定时器定时的终值。如果是同步模式,则第2行语句会在定时器定时完毕后再输出
转载自: http://blog.csdn.net/misskissc/article/details/9963515