async_resolve 中的 boost::asio::ip::tcp::resolver::iterator 的生命周期是多少?

2024-01-30

当我打电话时boost::asio::ip::tcp::resolver::async_resolve,我的处理程序收到一个ip::tcp::resolver::iterator迭代一个或多个ip::tcp::resolver::entries. 他们的寿命是多少,让他们活下去的把柄是什么?

例如,如果我得到第一个entry并启动一个tcp::async_connect到它,然后在async_connect处理程序,我可以迭代到下一个吗entry并启动另一个async_connect到下一个条目(只要我通过iterator to the async_connect当然是处理程序)?

什么时候做resolver::iterator and resolver::entries清理干净了吗?我是否必须做任何特别的事情,或者只是让它们超出范围并且不被任何回调闭包所持有?

(我知道我可以遍历所有resolver::entries in my async_resolve处理程序并将它们存储在智能指向的结构或其他结构中,以便我控制它们的生命周期,但是如果asio::ip::tcp::resolver已经在处理它了,如果我让它完成它的工作,我的代码会更简单。)


解构问题

迭代器具有值语义。因此它们的生命周期总是与周围对象的生命周期或其存储持续时间绑定(堆栈用于自动,堆用于动态,有时甚至其他对象例如静态)。

我想你想了解validity而是迭代器。

Well, 文档显示 http://www.boost.org/doc/libs/1_65_1/doc/html/boost_asio/reference/ip__basic_resolver_iterator/iterator_category.html迭代器类别是前向迭代器 http://en.cppreference.com/w/cpp/concept/ForwardIterator。前向迭代器具有“多次传递保证”,允许重复取消引用迭代器的副本,产生相同的结果。

所以,我们已经完成了一半:保留迭代器仍然可以。然而,当然,就像任何其他[前向]迭代器一样,我们必须考虑迭代器失效 https://stackoverflow.com/questions/16904454/what-is-iterator-invalidation.

所以,真正的问题归结为:解析器迭代器何时失效.

我们知道什么?

用例resolve函数满足的是联系。对于连接而言,第一个有效的端点就足够了,因此不需要实际保留列表。

本着按需付费的精神,解析器将状态保持的时间超过所需的时间是没有意义的。另一方面,如果不支持 Multipass,则迭代器位于 ForwardIterator 类别中是没有意义的。

文档什么也没说。我们只有一个办法:深入代码

深入研究代码

我们发现了一些表面之下的步骤:asio/detail/resolver_service.hpp:73 https://github.com/boostorg/asio/blob/boost-1.65.1/include/boost/asio/detail/resolver_service.hpp#L73

  // Asynchronously resolve a query to a list of entries.
  template <typename Handler>
  void async_resolve(implementation_type& impl,
      const query_type& query, Handler& handler)
  {
    // Allocate and construct an operation to wrap the handler.
    typedef resolve_op<Protocol, Handler> op;
    typename op::ptr p = { boost::asio::detail::addressof(handler),
      boost_asio_handler_alloc_helpers::allocate(
        sizeof(op), handler), 0 };

resolve_op显示迭代器是使用创建的basic_resolver_iterator.hpp::创建 https://github.com/boostorg/asio/blob/boost-1.65.1/include/boost/asio/ip/basic_resolver_iterator.hpp#L76

这给我们带来了答案:line 251 https://github.com/boostorg/asio/blob/boost-1.65.1/include/boost/asio/ip/basic_resolver_iterator.hpp#L251

  typedef std::vector<basic_resolver_entry<InternetProtocol> > values_type;
  boost::asio::detail::shared_ptr<values_type> values_;
  std::size_t index_;

因此,只要您保留有效迭代器(而不是最终迭代器)的副本,您就可以继续取消引用它。它甚至会保留查询参数的副本(host_name and service_name)与每个解析器条目。这看起来有点浪费,但我想在设计缓存方案时可能会派上用场。

总结:

  • Q.解析器迭代器何时失效?
  • A.当有效迭代器的最后一个副本被破坏时。

这意味着“它们始终保持有效”(如果它们曾经有效)。


与例如相反输入迭代器

² 一般来说,C++ 实现遵循 零开销原则:你不使用的东西,你就不需要付费 [C++ 的设计和演化,1994]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

async_resolve 中的 boost::asio::ip::tcp::resolver::iterator 的生命周期是多少? 的相关文章

随机推荐

  • 如何获取 UI 元素的屏幕位置?

    我正在尝试获取 UI 元素的全局位置 我尝试了很多不同的方法来获得这个职位 但似乎都不起作用 问题出在锚点上 因为我移动它们而不是 UI 元素位置本身 出于分辨率目的 检查器中显示的 UI 位置始终为 0 0 0 我还尝试让anchored
  • 为什么精挑细选会导致仓库不稳定? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我不是开发人员 在我们的一个项目中 由于很多门票需要时间才能完成 因此我们一直在挑选我们的提交 现在我们必须经常这样做 一位开发人员告诉我
  • 为什么我的 jquery UI 日期选择器没有默认为英语

    我基本上复制了代码从这里 http jqueryui com demos datepicker 但是当我测试我的网站时我看到了这个 替代文本 http img148 imageshack us img148 8167 datepicker
  • 是否可以在 Action Script 3 中动态创建用户定义类的实例?

    我有一个工厂 其中 Action Script 遵循 xml 并从中构建 DisplayObject 层次结构 这意味着脚本事先并不知道它将在 xml 中遇到哪些元素 因此也不知道它将需要哪些用户定义的工厂类 我知道可以做这样的事情 var
  • Web 部署 - 使用相对路径进行本地文件系统部署

    我想使用 Web 部署来运行自定义部署设置 因为我希望在许多不同的环境 团队成员本地计算机 4 个不同的构建服务器 上运行时都能正常工作 所以我想部署到相对的本地路径 我想做的是 部署到本地relative path 让构建后的步骤做神奇的
  • 扭曲中的持久连接

    我是 Twisted 的新手 有一个问题 如何在 Twisted 中组织持久连接 我有一个队列 每秒都会检查它 如果有一些 发送给客户端 我找不到比每秒调用 dataReceived 更好的方法了 下面是协议实现的代码 class Sync
  • 同构镜片

    我对 van Laarhoven 的一个小例子感兴趣同构透镜 http twanvl nl blog haskell isomorphism lenses 应用于像这样的数据类型data BValue BValue Float Float
  • android:smoothScrollToPosition()无法正常工作

    在将元素添加到与列表视图关联的数组适配器后 我试图平滑地滚动到列表的最后一个元素 问题是它只是滚动到随机位置 arrayadapter add item DOES NOT WORK CORRECTLY listview smoothScro
  • 如何在tensorflow keras中使用CRF?

    代码是这样的 import tensorflow as tf from keras contrib layers import CRF from tensorflow import keras def create model max se
  • 在Python中从url下载csv.gz文件

    我在从网址下载 csv gz 文件时遇到问题 我在下载 tar gz 文件时没有问题 对于 csv gz 文件 我可以提取 gz 文件并读取我的 csv 文件 如果我可以使用 URL 而不是事先拥有 csv 1 0 csv gz 那就很方便
  • 为 UIBarButtonItem 设置图像 - 图像拉伸

    当我尝试使用 UIBarButtonItem 的 initWithImage 来初始化导航栏自定义图像时 它会被冲破并拉伸到黑色导航栏上 这就是我创建它的方式 UIBarButtonItem button UIBarButtonItem a
  • 警告:为 foreach() 提供的参数无效

    results mysql query select from classpics foreach results as uno echo td valign middle align center a class neutral href
  • Linux中使用的offsetof

    我正在研究如何在给定结构中找到特定变量的偏移量 我尝试了以下程序 struct info char a int b char c int d struct info myinfo int main int argc char argv st
  • 缓存URL内容

    我有一个非常简单的用例 当远程端的内容发生变化时 例如 当 上次修改 发生变化时 通过正确和自动重新加载来缓存 URL 的内容 我怎样才能在Java中做到这一点 注意 我的类路径上有 spring guava 和 commons lang3
  • 从 ABC 和 django.db.models.Model 继承会引发元类异常

    我正在尝试使用Python 3实现一个Django数据模型类 它也是一个接口类 我这样做的原因是 我正在为我的同事编写一个基类 并且需要他全部实现三个方法他从我的课程中派生出来的 我试图为他提供一种简化的方式来使用我设计的系统的功能 但是
  • 如何让Python Yaml库以人性化的方式保存?

    这是我得到的 Python 代码 d ToGoFirst aaa Second bbb Pagargaph Lorem ipsum dolor sit amet consectetur adipiscing elit sed do eius
  • 每次抽奖都重画不变的背景?

    这可能是一个非常简单的问题 但我搜索后发现没有其他方法可以做到这一点 每次绘制时都重新绘制背景是没有意义的 有没有办法画一些东西并将它们留在屏幕上 我试图注释掉 GraphicsDevice Clear Color CornflowerBl
  • 从另一个应用程序窗口获取焦点控件的句柄

    我有一个应用程序有一些控件 按钮 编辑等 的窗口 我需要模拟用户事件 如 Tab 单击和输入文本 我在用着keybd event在 Tab 键顺序控件 编辑框 之间移动焦点并为其输入文本 但我需要知道当前焦点控件的句柄 例如从中获取文本或更
  • 使用 ASP.NET Web API 并行进行基本身份验证和表单身份验证

    免责声明 首先我要说的是 我是 MVC4 Web Api 一般 Web 服务 JQuery 的新手 我可能从错误的角度攻击这个问题 我正在尝试用 C 为 NET 4 构建一个 Web MVC 应用程序 Web API 以部署在 Azure
  • async_resolve 中的 boost::asio::ip::tcp::resolver::iterator 的生命周期是多少?

    当我打电话时boost asio ip tcp resolver async resolve 我的处理程序收到一个ip tcp resolver iterator迭代一个或多个ip tcp resolver entries 他们的寿命是多少