text: 
  #include <iostream>
  #include <boost/asio.hpp>
  #include <boost/thread/thread.hpp>
  #include <boost/bind.hpp>
  #include <boost/date_time/posix_time/posix_time.hpp>
  
  class printer {
  
  public:
  
      printer(boost::asio::io_service& io)
          : strand_(io),
            timer1_(io, boost::posix_time::seconds(1)),
            timer2_(io, boost::posix_time::seconds(1)),
            count_(0)
      {
          timer1_.async_wait(strand_.wrap(boost::bind(&printer::print1, this)));
          timer2_.async_wait(strand_.wrap(boost::bind(&printer::print2, this)));
      }
  
      ~printer()
      {
          std::cout << "Final count is " << count_ << "\n";
      }
  
      void print1()
      {
  
          std::cout << "print 1:" << boost::this_thread::get_id() << std::endl;
          if (count_ < 10)
          {
              std::cout << "Timer 1: " << count_ << "\n";
              ++count_;
  
              timer1_.expires_at(timer1_.expires_at() + boost::posix_time::seconds(1));
              timer1_.async_wait(strand_.wrap(boost::bind(&printer::print1, this)));
          }
      }
  
      void print2()
      {
          std::cout << "print 2:" << boost::this_thread::get_id() << std::endl;
          if (count_ < 10)
          {
              std::cout << "Timer 2: " << count_ << "\n";
              ++count_;
  
              timer2_.expires_at(timer2_.expires_at() + boost::posix_time::seconds(1));
              timer2_.async_wait(strand_.wrap(boost::bind(&printer::print2, this)));
          }
      }
  
  private:
      boost::asio::strand strand_;
      boost::asio::deadline_timer timer1_;
      boost::asio::deadline_timer timer2_;
      int count_;
  };
  
  
  int main() {    
  
      std::cout << boost::this_thread::get_id() << std::endl;
      boost::asio::io_service io;
      printer p(io);
      boost::thread t(boost::bind(&boost::asio::io_service::run, &io));
      io.run();
      t.join();
  
      return 0;
  }
  
  