読者です 読者をやめる 読者になる 読者になる

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

C++

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