函数 main() 首先定义了一个 I/O 服务 io_service,用于初始化 I/O 对象 timer。 就象 boost::asio::deadlinetimer 那样,所有 I/O 对象通常都需要一个 I/O 服务作为它们的构造函数的第一个参数。 由于 _timer 的作用类似于一个闹钟,所以 boost::asio::deadlinetimer 的构造函数可以传入第二个参数,用于表示在某个时间点或是在某段时长之后闹钟停止。 以上例子指定了五秒的时长,该闹钟在 _timer 被定义之后立即开始计时。

    虽然我们可以调用一个在五秒后返回的函数,但是通过调用方法 async_wait() 并传入 handler() 函数的名字作为唯一参数,可以让 Asio 启动一个异步操作。 请留意,我们只是传入了 handler() 函数的名字,而该函数本身并没有被调用。

    async_wait() 这样的方法被称为是非阻塞式的。 I/O 对象通常还提供了阻塞式的方法,可以让执行流在特定操作完成之前保持阻塞。 例如,可以调用阻塞式的 wait() 方法,取代 boost::asio::deadline_timer 的调用。 由于它会阻塞调用,所以它不需要传入一个函数名,而是在指定时间点或指定时长之后返回。

    再看看上面的源代码,可以留意到在调用 async_wait() 之后,又在 I/O 服务之上调用了一个名为 run() 的方法。这是必须的,因为控制权必须被操作系统接管,才能在五秒之后调用 handler() 函数。

    1. #include <boost/asio.hpp>
    2. #include <iostream>
    3.  
    4. void handler1(const boost::system::error_code &ec)
    5. {
    6. std::cout << "5 s." << std::endl;
    7.  
    8. void handler2(const boost::system::error_code &ec)
    9. {
    10. std::cout << "10 s." << std::endl;
    11. }
    12.  
    13. int main()
    14. boost::asio::io_service io_service;
    15. boost::asio::deadline_timer timer1(io_service, boost::posix_time::seconds(5));
    16. timer1.async_wait(handler1);
    17. boost::asio::deadline_timer timer2(io_service, boost::posix_time::seconds(10));
    18. timer2.async_wait(handler2);
    19. io_service.run();
    20. }

    上面的程序用了两个 类型的 I/O 对象。 第一个 I/O 对象表示一个五秒后触发的闹钟,而第二个则表示一个十秒后触发的闹钟。 每一段指定时长过去后,都会相应地调用函数 handler1()handler2()

    main() 的最后,再次在唯一的 I/O 服务之上调用了 run() 方法。 如前所述,这个函数将阻塞执行,把控制权交给操作系统以接管异步处理。 在操作系统的帮助下,handler1() 函数会在五秒后被调用,而 handler2() 函数则在十秒后被调用。

    一旦特定的 I/O 服务的所有异步操作都完成了,控制权就会返回给 run() 方法,然后它就会返回。 以上两个例子中,应用程序都会在闹钟到时间后马上结束。