使用 Boost.Asio 时确保有效对象寿命的最佳方法是什么?

2024-04-09

最近经常使用 Boost.Asio。我非常喜欢这个库,因为它提供了一种从当今的多核系统中榨取性能的绝佳方法。

我曾多次问过自己这个问题,我认为在使用 Asio 进行异步调用时值得抛出关于对象生命周期/所有权的问题。

我反复遇到的问题是,您经常必须“过期”仍然有异步回调待处理的对象。如果该对象在调用回调之前超出范围,则不可避免地会发生问题。

为了解决这个问题,我开始使用boost::enable_shared_from_thistemplate 作为大多数基于 asio 的类的基类。这工作正常,但有点麻烦:通常这也意味着保护构造函数并向类添加工厂方法,以确保所有实例都是在共享指针内创建的。

我只是想知道其他人是如何解决这个问题的。我是用最好的方式来解决这个问题吗?或者我的 Asio.Foo 都错了?

讨论... :)


Using boost::enable_shared_from_this这几乎就是做到这一点的方法。另外,看看使用boost::weak_ptr如果您需要对不应该保留该对象的对象的引用(如果它们是唯一保留的引用)。

一个很好的使用例子weak_ptr: I use enable_shared_from_this在我的套接字类中使用boost::asio. The boost::asio框架是唯一通过读写处理程序存储对对象的持久引用的东西。因此,当调用套接字的析构函数时,我知道套接字已关闭,并且我可以在处理程序中“做一些事情”来清理该关闭的套接字。使用套接字的应用程序只有一个weak_ptr引用它,它促进了shared_ptr当它想要使用套接字时(通常是写入它)。尽管套接字的关闭处理程序通常会清除所有套接字,但可以检查该提升是否失败,以防套接字消失。weak_ptr甚至在发生之前就适当地参考。

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

使用 Boost.Asio 时确保有效对象寿命的最佳方法是什么? 的相关文章

  • EventHandler 应该始终用于事件吗?

    我一直在愉快地使用自定义委托类型和通用编写事件Action委托类型 没有真正考虑我在做什么 我有一些很好的扩展助手Action and EventHandler这使我倾向于使用那些预定义的委托类型而不是我自己的委托类型 但除此之外 除了惯例
  • 使用 Xamarin.Forms 和 Zxing 生成 QR 码

    我在网上看到了很多关于这个的内容 旧帖子 但似乎没有什么对我有用 我正在尝试从字符串中生成二维码并将其显示在应用程序中 这就是我一开始的情况 qrCode new ZXingBarcodeImageView BarcodeFormat Ba
  • OpenGL缓冲区更新[重复]

    这个问题在这里已经有答案了 目前我正在编写一个模拟水的程序 以下是我所做的步骤 创建水面 平面 创建VAO 创建顶点缓冲区对象 在其中存储法线和顶点 将指针绑定到此 VBO 创建索引缓冲区对象 然后我使用 glDrawElements 渲染
  • .pdbs 会减慢发布应用程序的速度吗?

    如果 dll 中包含 pdb 程序调试 文件 则行号将出现在引发的任何异常的堆栈跟踪中 这会影响应用程序的性能吗 这个问题与发布与调试 即优化 无关 这是关于拥有 pdb 文件的性能影响 每次抛出异常时都会读取 pdb 文件吗 加载程序集时
  • 以下 PLINQ 代码没有改进

    我没有看到使用以下代码的处理速度有任何改进 IEnumerable
  • PrivateObject 找不到属性

    我的结构基本上如下所示 abstract class A protected string Identificator get set private void DoSomething DoSomethingSpecific protect
  • 检测 TextBox 中的 Tab 键按下

    I am trying to detect the Tab key press in a TextBox I know that the Tab key does not trigger the KeyDown KeyUp or the K
  • 编写具有多种类型的泛型扩展方法时的类型推断问题

    我正在为 IEnumerable 编写一个通用扩展方法 用于将对象列表映射到另一个映射对象列表 这就是我希望该方法的工作方式 IList
  • 从点云检测平面集

    我有一组点云 我想测试3D房间中是否有角落 所以我想讨论一下我的方法 以及在速度方面是否有更好的方法 因为我想在手机上测试它 我将尝试使用霍夫变换来检测线 然后我将尝试查看是否有三条线相交 并且它们也形成了两个相交的平面 如果点云数据来自深
  • 是否可以在Linux上将C转换为asm而不链接libc?

    测试平台为Linux 32位 但也欢迎 Windows 32 位上的某些解决方案 这是一个c代码片段 int a 0 printf d n a 如果我使用 gcc 生成汇编代码 gcc S test c 然后我会得到 movl 0 28 e
  • 如何使用 C# 查询远程 MS ACCESS .mdb 数据库

    我正在尝试使用 C 查询 mote MS ACCESS 数据库 mdb 文件 将文件复制到本地计算机时可以成功查询它 我只想远程放置文件 所以我的客户端程序不包含原始数据 static string m path http www xyz
  • 时间:2019-03-17 标签:c#TimerStopConfusion

    我想通过单击按钮时更改文本颜色来将文本框文本设置为 闪烁 我可以让文本按照我想要的方式闪烁 但我希望它在闪烁几次后停止 我不知道如何在计时器触发几次后让它停止 这是我的代码 public Form1 InitializeComponent
  • java中使用多线程调用同一类的不同方法

    我有一个类 如下所示 具有三种方法 public class MyRunnable implements Runnable Override public void run what code need to write here to c
  • 当 Verb="runas" 时设置 ProcessStartInfo.EnvironmentVariables

    我正在开发一个 C 应用程序 我需要创建变量并将其传递给新进程 我正在使用ProcessStartInfo EnvironmentVariables 新进程必须提升运行 因此我使用 Verb runas var startInfo new
  • 值和类型的简洁双向静态 1:1 映射

    我将从我想象如何使用我想要创建的代码开始 它不必完全像这样 但它是我在标题中所说的 简洁 的一个很好的例子 就我而言 它是将类型映射到相关的枚举值 struct bar foo
  • 初始化列表在 VC10 中不起作用

    我在 VC 2010 中编写了这个程序 class class1 public class1 initializer list
  • 使用 IdentityDbContext 和 Code First 自动迁移表位置和架构的实体框架?

    我正在尝试使用 IdentityDbContext 类设置自动迁移更新 并将更改传播到整个数据库的实际 DbContext 在进入代码之前 在使用自动迁移实现 IdentityDbContext 时 我收到此错误 影响迁移历史系统表位置的自
  • MSVC编译器下使用最大成员初始化联合

    我正在尝试初始化一个LARGE INTEGER在 C 库中为 0 确切地说是 C 03 以前 初始化是 static LARGE INTEGER freq 0 在 MinGW 下它产生了一个警告 缺少成员 LARGE INTEGER Hig
  • Emacs C++,打开相应的头文件

    我是 emacs 新手 我想知道 是否有在头文件 源文件和相应的源文件 头文件之间切换的快捷方式 是否有像通用 emacs 参考卡那样的参考卡 Thanks There s ff find other file 您可以使用以下方法将其绑定到
  • 是否可以使用 Dapper 流式传输大型 SQL Server 数据库结果集?

    我需要从数据库返回大约 500K 行 请不要问为什么 然后 我需要将这些结果保存为 XML 更紧急 并将该文件通过 ftp 传输到某个神奇的地方 我还需要转换结果集中的每一行 现在 这就是我正在做的事情 TOP 100结果 使用 Dappe

随机推荐

  • 如何按组仅保留特定列中具有最低和最高值的行?

    简而言之 我该怎么办 structure list id c 1 2 3 4 5 6 user c 1 1 1 2 2 2 value c 1 3 5 2 5 9 Names c id user value row names c NA 6
  • 如何让 Rosenbrock23 在 ParameterizedFunctions.jl DSL 中使用 ODE?

    进一步这个问题 https stackoverflow com questions 54422068 how to fix typeerror in setindex in differentialequations jl 54423008
  • 从 CodeAttribute 内的参数获取 CodeClass?

    我正在研究一些 T4 代码生成 为此我需要在 BarAttribute 构造函数内传递的类型的 CodeClass class Baz class Bar Attribute public Bar Type type Bar typeof
  • Python pandas 检查数据框是否不为空

    我有一个if语句 它检查数据框是否不为空 我的做法如下 if dataframe empty pass else do something 但我确实需要 if dataframe is not empty do something 我的问题
  • 创建“集合字典”

    我需要将数据有效地存储在类似于 集合字典 的东西中 例如有一个字典 其中包含与每个唯一键匹配的多个 唯一 值 我的数据源是一个 不是很好 结构化的 XML 我的想法是 我将浏览许多元素并找到关键 如果key不存在 则将其添加到字典中 如果已
  • 如何在宏 gcc 中添加警告禁用编译指示

    我需要禁用以下代码中宏 LOG W 内部产生的警告 为此 我将此宏包装在另一个宏 LOG W 中 并禁用了其中的警告 Wold style cast 然后在代码中我使用 LOG W 代替 但是我仍然收到警告并且无法找出原因 任何指示表示赞赏
  • Netty 和字节顺序

    由于文档不完善并且缺乏 Netty 经验 我遇到了一些问题 我不知道如何设置默认的 ByteOrder 我需要一个小尾数法默认设置 如果有人能给我一些关于这方面的提示 我会很高兴 你可以使用Bootstrap setOption 去做这个
  • 为什么使用 Schema.org 微数据来标记网页元素?

    我明白为什么以及如何使用Schema org http schema org 将微数据添加到您的网站 这不是一个问题 问题是为什么 Schema org 支持某些可以用简单 HTML5 标记的内容 其中包括 Types WebPage ht
  • 使用 JavaScript 变量作为函数名?

    我在 Javascript 中有以下代码 jQuery document ready function var actions new Object var actions actions 0 create actions 1 update
  • 如何打开嵌入的资源word文档?

    我的项目中有一个嵌入的 Word 模板文档 我将其添加为资源 Resources resx gt 添加资源 gt 添加现有文件 现在我想打开它 如下所示 Microsoft Office Interop Word Application a
  • 如何使用 JavaScript 源地图(.map 文件)?

    最近我看到文件带有 js map一些 JavaScript 库附带的扩展 例如Angular http code angularjs org 这在我脑海中提出了几个问题 它是做什么用的 为什么 Angular 的人要关心交付一个 js ma
  • 尝试执行 axis2 服务客户端时出现异常

    我正在尝试创建一个示例 axis2 ServiceClient 它抛出以下错误 org apache axiom om OMException No meta factory found for feature default this u
  • 使用故事板时从 UITabbarController 添加/删除或显示/隐藏选项卡栏项目

    我有一个应用程序需要显示不同的内容UITabBarController基于用户是否注册 有没有办法添加和删除ViewControllers 来自 aUITabBarController在运行时 显示和隐藏也很好 在故事板之前你可以打电话se
  • sudo bang bang 到底是什么? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 sudo bang bang 的目的是什么 sudo 什么时候可能需要使用它 砰砰砰 命令是一个快捷方式重复您在终端中输入的上一个命令 当您忘记需要管
  • 无法直接从浏览器访问 Angular 组件

    我有一个使用 Angular 1 5 组件的小型 Web 应用程序 当我启动服务器时 浏览器将我重定向到http 127 0 0 1 50001 欢迎 http 127 0 0 1 50001 welcome 这是预期的 并且欢迎页面出现
  • Python断言风格

    我想知道我所做的是否是一种适当的断言方法 我正在尝试为 Python 的风格指南制作一些既简洁又非常正确的东西 try assert self port number 0 assert self handle None assert isi
  • viewDidLoad() 中的 tableView 数据源为空 - Swift

    下面是我的 ViewController 代码 GetRequest 中的 println 打印从 HTTP GET 请求接收到的正确数据 此时tableData有10个键值对 但是 如果我在 viewDidLoad 中调用 GetRequ
  • “集合已修改...”问题

    我有一个函数可以检查对象列表以查看它们是否已被单击并相应地触发 OnClick 事件 我相信该功能工作正常 但我遇到了问题 当我挂接到其中一个 OnClick 事件并删除该元素并将其插入到列表中的不同位置 该程序的典型功能 时 我收到 集合
  • 从 Hudson 获取 Eclipse PDT 每晚构建

    我一直在寻找 PDT 的最新夜间版本 但是官方下载网站 http www eclipse org epp download php仅截至 2010 年 9 月为止 经过一番搜索后 我被引导到他们CVS 仪表板 https hudson ec
  • 使用 Boost.Asio 时确保有效对象寿命的最佳方法是什么?

    最近经常使用 Boost Asio 我非常喜欢这个库 因为它提供了一种从当今的多核系统中榨取性能的绝佳方法 我曾多次问过自己这个问题 我认为在使用 Asio 进行异步调用时值得抛出关于对象生命周期 所有权的问题 我反复遇到的问题是 您经常必