asio io_service中的一项任务

时间:2016-03-23 19:27:21

标签: boost-asio

io_service有一个任务(deadline_timer),每1秒触发一次。 接下来,我想通过thread t1(bind(&io_service::run, &ios));为其他一些任务创建新线程。

如何确定(如果可能)deadline_timer不会被中断?或者更好的是,确保它有自己的主题。

1 个答案:

答案 0 :(得分:1)

为了保证I / O对象(例如deadline_timer)有自己的专用线程,可以使用多个io_service对象:

  • 由单个线程或一组线程处理的计时器io_service
  • io_service用于由不同线程或不同线程组处理的所有其他任务和I / O对象

使用多个io_service对象有助于防止事件处理和调度之间的争用。例如,io_service不会受到完成处理程序的影响,该处理程序需要很长时间才能在不同的io_service内完成。但是,所有线程仍然受OS调度程序的影响,可能会发生中断。

以下是使用多个io_service个对象的示例demonstrating,其中deadline_timer正由专用线程处理:

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

void arm_timer(boost::asio::deadline_timer& timer)
{
  timer.expires_from_now(boost::posix_time::milliseconds(500));
  timer.async_wait([&timer]
    (const boost::system::error_code& error)
    {
      std::cout << "timer: " << error.message() << std::endl;
      arm_timer(timer);
    });
}

int main()
{
  // Dedicate an io_service and thread to a single timer.
  boost::asio::io_service timer_io_service;
  boost::asio::deadline_timer timer(timer_io_service);
  arm_timer(timer);
  std::thread timer_thread([&timer_io_service]() {
    timer_io_service.run();
  });

  // Use a different io_service for other tasks.
  boost::asio::io_service io_service;

  // Post a tasks to stop the timer io_service.
  io_service.post([&timer_io_service]{
    timer_io_service.stop();
  });

  // Let timer run.
  std::this_thread::sleep_for(std::chrono::seconds(2));
  io_service.run();

  timer_thread.join();  
}