【问题标题】:Understanding boost::asio::post with single callable - who executes?使用单个可调用了解 boost::asio::post - 谁执行?
【发布时间】:2023-03-22 03:14:01
【问题描述】:

我想知道我应该如何理解boost::asio::post

尤其是这个重载,它可以只接受一个callable,现在谁/什么/在哪里执行它(因为我没有明确地传递一个io_service/io_context) ?

它只是随机(或多或少)选择一个正在运行的io_service(如果有的话)?我觉得我完全失去了一些东西。

【问题讨论】:

  • 它确实说“通过在您自己的链接底部执行get_associated_executor(handler)来获取处理程序的关联执行器对象ex。这能回答问题吗?如果不是,你真的只是在问get_associated_executor 返回什么?

标签: c++ c++17 boost-asio


【解决方案1】:

最终,boost::asio::post 将使用get_associated_executor 来查找associated_executor 的特化。默认实现将提供system_executor 的静态实例,将在其中调用对象。

【讨论】:

  • 这确实让我想知道,我不知道 system_executor 或 associated_executor - 或许,你能详细说明一下吗?
  • system_executor 也确实不适合我的目的,因为它提到了一个线程池,我需要所有东西都在同一个线程上运行(从而避免同步)!
  • @darune 可能你只需要学习asio的基础...Best documentation for Boost:asio?
  • @Darune 我个人从未有过post 的单参数版本的用例,因为我总是想指定要在其上运行的执行程序。当您想根据类型将某些处理程序路由到静态执行程序时,它似乎存在。显然,ASIO 的实现者认为它很有用。深入了解如何更充分地使用 ASIO 有点超出了单个堆栈溢出问题的范围。
  • @DaveS 谢谢,我明白了,我最终也使用了那个版本——如果它保证相同的线程/io_context(或者那将是一个配置),那么单个参数可能会更有用
【解决方案2】:

Dave S's answer 是正确的,但是如果代码的编写者与默认签名混淆,想象一下读者会发生什么!最好只使用带有显式执行上下文参数的thisthis 重载。

【讨论】:

  • 我已经 +1-ed 这个提及显式执行器重载。但是不要忘记,在许多情况下,隐含的“魔术”行为(与相关的执行程序)正是您/想要/拥有的(例如,当任务是一个链式包装的完成处理程序时,您不知道它属于哪个链。这就是关联执行器变得非常强大的地方)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-26
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
  • 1970-01-01
  • 1970-01-01
  • 2018-07-28
相关资源
最近更新 更多