boost::asio::deadline_timerは複数のハンドラで待機できる

昨日の記事「boost::asio::deadline_timerは複数のタイマーを持てる」は誤りでした。
タイマーはひとつのインスタンスでひとつしか設定できず、複数設定できるのはasync_waitによる複数ハンドラの待機でした。

以下では、on_timerを2回async_waitしてるので、2秒後に2回on_timerが呼ばれます。

#include <iostream>
#include <string>
#include <ctime>
#include <boost/asio.hpp>
#include <boost/format.hpp>

namespace asio = boost::asio;

std::string now()
{
    std::time_t t;
    std::time(&t);
    std::tm* st = std::localtime(&t);

    return (boost::format("%1%/%2%/%3% %4%:%5%:%6% : ")
                % (1900 + st->tm_year)
                % (1 + st->tm_mon)
                % st->tm_mday
                % st->tm_hour
                % st->tm_min
                % st->tm_sec
            ).str();
}

void on_timer(const boost::system::error_code& error)
{
    std::cout << now() << error.message() << std::endl;
}

int main()
{
    asio::io_service io_service;
    
    asio::deadline_timer timer(io_service);

    std::cout << now() << "start" << std::endl;

    timer.expires_from_now(boost::posix_time::seconds(2));
    timer.async_wait(on_timer);
    timer.async_wait(on_timer);
    
    io_service.run();
}
2011/6/29 9:53:35 : start
2011/6/29 9:53:37 : この操作を正しく終了しました。
2011/6/29 9:53:37 : この操作を正しく終了しました。