boost::asio::deadline_timerは複数のタイマーを持てる

deadline_timerは一つの非同期操作しか持てないと思っていたらいくつでも持てるようです。

シングルスレッドで動かした場合。

#include <iostream>
#include <boost/asio.hpp>

namespace asio = boost::asio;

void on_timer(const boost::system::error_code& error)
{
    std::cout << "on timer" << std::endl;
}

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

    timer.expires_from_now(boost::posix_time::seconds(2));
    timer.async_wait(on_timer);
   
    timer.expires_from_now(boost::posix_time::seconds(4));
    timer.async_wait(on_timer);
   
    io_service.run();
}
on timer
on timer

2スレッド使った場合。

#include <iostream>
#include <boost/asio.hpp>
#include <boost/thread.hpp>

namespace asio = boost::asio;

void on_timer(const boost::system::error_code& error)
{
    std::cout << "on timer" << std::endl;
}

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

    timer.expires_from_now(boost::posix_time::seconds(2));
    timer.async_wait(on_timer);
   
    timer.expires_from_now(boost::posix_time::seconds(4));
    timer.async_wait(on_timer);
   
    boost::thread t1(boost::bind(&asio::io_service::run, &io_service));
    boost::thread t2(boost::bind(&asio::io_service::run, &io_service));
   
    t1.join();
    t2.join();
}
on timer
on timer

ひとつのdeadline_timerで複数のタイマーが動いてます。


追記 2011/06/28 15:44:
これだと、1つめのタイマーがキャンセルされてしまうようです…。
検証不足によるミスでした。

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

namespace asio = boost::asio;

void on_timer(const boost::system::error_code& error)
{
    std::time_t t;
    std::time(&t);
    std::tm* st = std::localtime(&t);

    std::cout
        << 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
        << error.message()
    << std::endl;
}

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

    timer.expires_from_now(boost::posix_time::seconds(2));
    timer.async_wait(on_timer);
    
    timer.expires_from_now(boost::posix_time::seconds(4));
    timer.async_wait(on_timer);
    
    io_service.run();
}
2011/6/28 15:46:27 : Operation canceled
2011/6/28 15:46:31 : Undefined error: 0