multithreading - 如何取消线程中的 io_service 对象?
问题描述
我的理解是,要结束这个计时器线程,我需要在 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.
}
解决方案
首先,我通常不会打电话io_service::stop
。相反,我会取消所有待处理的工作并等待服务正常返回。
只有失败了,我才会退回到io_service::stop
.
其次,它io_service
是少数被记录为线程安全的 Asio 对象之一(构造/破坏除外)。所以你可以io_service::stop
从任何地方调用,只要你能确定对象是活着的(没有被破坏)。
推荐阅读
- javascript - Newman Library - 获取在收集运行期间创建的环境变量
- javascript - 将相同的数据存储到 storage.sync 中,Chrome 使用的配额比 Firefox 多得多
- mongodb - 如何在 mongodb $group 运算符中获取数组的长度?
- javascript - 如何使用 Natife 文件系统 Api 保存大数据
- java - VisualizeMonocularPlaneVisualOdometryApp boofcv 标定
- python - 使用 pandas 样式功能更改多级索引字体
- swift - 自动更正后需要额外的 swiftlint 命令吗?
- python - 使用读取的txt文件制作目录
- kubernetes-helm - 如何在 helm 模板中访问超出当前范围控制的变量
- google-apps-script - Google Apps 脚本:在矩阵中取一些行或子矩阵?