我的理解是,要结束此计时器线程,我需要在io_service对象上调用stop()。我这样做是为了使MyClass对象(也作为线程运行)在线程结束时不会以活动异常结束。
如何使用lambda取消标准线程中的io_service对象?
class MyClass
{
private:
boost::asio::io_service io;
// ...
}
void MyClass::operator()()
{
boost::asio::deadline_timer my_timer(io,
boost::posix_time::seconds(300));
my_timer.async_wait(boost::bind(&MyTest::pump, this,
boost::asio::placeholders::error, &my_timer));
std::unique_ptr<std::thread> io_thread(
std::make_unique<std::thread>([&] { io.run(); }));
// ...
// cancel here.
}
答案 0 :(得分:1)
首先,我通常不会打电话给io_service::stop
。相反,我会取消所有待处理的工作,然后等待服务正常返回。
只有失败了,我才会退回到io_service::stop
。
第二,io_service
是少数几个Asio对象之一,该对象已被证明是线程安全的(构造/销毁除外)。因此,只要您可以确定对象仍然存在(未破坏),就可以从任何地方调用io_service::stop
。