我io_service
有一个任务(deadline_timer),每1秒触发一次。
接下来,我想通过thread t1(bind(&io_service::run, &ios));
为其他一些任务创建新线程。
如何确定(如果可能)deadline_timer不会被中断?或者更好的是,确保它有自己的主题。
答案 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();
}