1、asio综述
asio的核心类是io_service,它相当于前摄器模式的Proactor角色,在异步模式下发起的I/O操作,需要定义一个用于回调的完成处理函数,当I/O完成时io_service会调用注册的完成处理函数。通过调用io_service的成员函数run()来启动前摄器的事件处理循环,阻塞等待所有的操作完成并分派事件。在异步模式下,如果不调用run()就没有了等待异步操作完成的机制,回调函数将得不到执行。
asio不直接使用线程,而是定义了一个自己的线程概念:strand,它保证在多线程环境中不使用互斥量代码可以正确执行,io_service::strand::wrap()可以封装一个函数在strand中执行。
asio中的两个类mutable_buffer和const_buffer用来封装缓冲区,可以被安全的用在异步读写中。asio通常不能直接使用数组、string、vector等来作为收发数据的缓冲区,函数buffer()能够包装常用的数据类型(数组、string、vector等)用于asio的数据收发。
asio的函数有两种重载形式:一种是有一个error_code(boost::system库中)的输出参数,调用函数后可以检查这个参数以判断是否发生了错误;一种是没有error_code参数,但发生了错误会抛出system_error(boost::system库中)异常,调用函数的时候应该使用try-catch块来捕获错误。
使用asio需要包含头文件"boost\asio.hpp",在VC下还要添加以下定义避免编译警告:
#ifdef _MSC_VER #define _WIN32_WINNT 0X0501 #endif #include "boost\asio.hpp"
2、定时器
deadline_timer是asio中的定时器类,它有两种形式的构造函数,第一个参数都是一个io_service对象,第二个参数可以是posix_time的绝对时间或者是自当前时间开始的一个时间段。创建定时器并指定终止时间后它就会立即开始计时,如果创建定时器时不指定终止时间,那么定时器不会开始工作,可以使用成员函数expires_at()或expires_from_now()设置终止时间,调用wait()同步等待或async_wai()设置异步等待,并注册完成时的回调handler。
deadline_timer的成员函数expires_at()可以获得计时器终止的绝对时间,成员函数cancel()用来取消异步操作。
deadline_timer的一些功能需要包含头文件"boost\date_time\posix_time\posix_time.hpp"。
下面为一个同步定时器的使用:
#ifdef _MSC_VER #define _WIN32_WINNT 0X0501 #endif #include "boost\asio.hpp" #include "boost\date_time\posix_time\posix_time.hpp" int main() { boost::asio::io_service ios; boost::asio::deadline_timer dt(ios, boost::posix_time::seconds(3)); cout << dt.expires_at() << endl; //输出终止时间 dt.wait(); //一直等待定时器终止 cout << "here" << endl; return 0; }