文章目录
Asio简介
Boost C++ 库 Asio,它是异步输入输出的核心。 名字本身就说明了一切:Asio 即异步输入/输出。 该库可以让 C++ 异步地处理数据,且平台独立。 异步数据处理就是指,任务触发后不需要等待它们完成。 相反,Boost.Asio 会在任务完成时触发一个应用。 异步任务的主要优点在于,在等待任务完成时不需要阻塞应用程序,可以去执行其它任务。
异步任务的典型例子是网络应用。 如果数据被发送出去了,比如发送至 Internet,通常需要知道数据是否发送成功。 如果没有一个像 Boost.Asio 这样的库,就必须要等待接收函数的返回值,并得到一个确认或是错误代码。 而使用 Boost.Asio,这个过程被分为两个单独的步骤:第一步是作为一个异步任务开始数据传输。 一旦传输完成,不论成功或是错误,应用程序都会在第二步中得到相应的结果通知。 主要的区别在于,应用程序无需阻塞至传输完成,而可以在这段时间里执行其它操作。
I/O服务与I/O对象
使用 Boost.Asio 进行异步数据处理的应用程序基于两个概念:I/O 服务 和 I/O 对象 。
I/O 服务抽象了操作系统的接口,允许第一时间进行异步数据处理.
I/O 对象则用于初始化特定的操作。
Boost.Asio 只提供了一个名为 boost::asio::io_service 的类作为 I/O 服务,它针对所支持的每一个操作系统都分别实现了优化的类,另外库中还包含了针对不同 I/O 对象的几个类。 其中,类 boost::asio::ip::tcp::socket 用于通过网络发送和接收数据,而类 boost::asio::deadline_timer 则提供了一个计时器,用于测量某个固定时间点到来或是一段指定的时长过去了。
以下示例使用了计时器,与 Asio 所提供的其它 I/O 对象相比较而言,它不需要任何有关于网络编程的知识。
#include <boost\asio.hpp>
#include <iostream>
void handler(const boost::system::error_code& ec)
{
std::cout << "5s" << std::endl;
}
int main()
{
boost::asio::io_service io_service;
boost::asio::deadline_timer timer(io_service, boost::posix_time::seconds(5));
timer.async_wait(handler);
io_service.run();
return 0;
}
函数 main() 首先定义了一个 I/O 服务 io_service ,用于初始化 I/O 对象 timer 。 由于 timer 的作用类似于一个闹钟,所以 boost::asio::deadline_timer 的构造函数可以传入第二个参数,用于表示在某个时间点或是在某段时长之后闹钟停止。 本例指定了五秒的时长,该闹钟在 timer 被定义之后立即开始计时。
通过调用方法 async_wait() 并传入handler() 函数的名字作为唯一参数,可以让 Asio 启动一个异步操作。 请留意,我们只是传入了 handler() 函数的名字,而该函数本身并没有被立即调用。
async_wait() 的好处是,该函数调用会立即返回,而不是等待五秒钟。 一旦闹钟时间到,作为参数所提供的函数就会被调用。 因此,应用程序可以在调用了 async_wait() 之后执行其它操作,而不是阻塞在这里。
像 async_wait() 这样的方法被称为是非阻塞式的。 I/O 对象通常还提供了阻塞式的方法,可以让执行流在特定操作完成之前保持阻塞。 例如,可以调用阻塞式的 wait() 方法,取代 boost::asio::deadline_timer 的调用。 由于它会阻塞调用,所以它不需要传入一个函数名,而是在指定时间点或指定时长之后返回。
在调用 async_wait() 之后,又在 I/O 服务之上调用了一个名为 run() 的方法。这是必须的,因为控制权必须被操作系统接管,才能在五秒之后调用 handler() 函数。
async_wait() 会启动一个异步操作并立即返回,而 run() 则是阻塞的。因此调用 run()后程序执行会停止。 具有讽刺意味的是,许多操作系统只是通过阻塞函数来支持异步操作。 以下例子显示了为什么这个限制通常不会成为问题。
#include <boost\asio.hpp>
#include <iostream>
void handler(const boost::system::error_code& ec)
{
std::cout << "5s" << std::endl;
}
void handler1(const boost::system::error_code& ec)
{
std::cout << "2m " << std::endl;
}
int main()
{
boost::asio::io_service io_service;
boost::asio::deadline_timer timer(io_service, boost::posix_time::seconds(5));
timer.async_wait(handler);
boost::asio::deadline_timer timer1(io_service, boost::posix_time::minutes(2)

本文深入探讨Boost.Asio库,讲解异步I/O服务、I/O对象、多线程扩展及网络编程应用,通过实例解析异步操作的启动与句柄函数执行。
最低0.47元/天 解锁文章
3015

被折叠的 条评论
为什么被折叠?



