【问题标题】:boost::asio socket async_* strandboost::asio 套接字 async_* 链
【发布时间】:2011-10-15 20:51:59
【问题描述】:

如何通过 strand 对 socket 进行 async_* 操作?我看过 Timer.5(Boost/Asio 示例),但它们只显示了如何调用用户的处理程序。当我async_write 到多线程应用程序中的套接字时,数据可能被写入损坏。并且strand 保证这些处理程序都不会同时执行。

【问题讨论】:

  • 您具体遇到了什么问题?使用 strand 与 not 使用 strand 时执行异步操作没有显着差异。只需将您的处理程序包裹在链中即可。
  • 这个问题目前的措辞没有意义,请编辑它并添加一些清晰度。
  • 这对我来说很有意义。我有同样的问题。多个线程试图使用单个连接读/写请求响应并且都搞砸了。我想要实现的是顺序读取请求/执行任何需要处理的操作(甚至是对不同服务的另一个请求/响应),然后将响应返回给原始请求者。

标签: sockets boost asynchronous boost-asio


【解决方案1】:

来自 Boost.Asio 文档:

io_service::strand 类提供了发布和调度的能力 处理程序,保证这些处理程序都不会执行 同时。

Boost.Asio 示例中有 a good example 和 strand 的用法。

strand 保证您的处理程序执行将同步。这意味着如果您的io_service 是从多个线程执行的,那么strand 很有用。这与您如何安排任务(处理程序)无关。

strand 无法帮助您同时执行多个套接字读取或写入操作,因为内部读取/写入执行不能同时执行,因此应该只有一个主动读取或写入异步操作。

对于reads,您只需调用async_read 来启动读取序列,并在使用接收到的数据后从您的读取处理程序中再次调用它。与您在单线程环境中所做的相同。

对于writes,如果有并发生产者(如果多个线程提供要写入套接字的数据),则需要一个并发队列(例如boost circular buffer,查找“Bounded Buffer Example”)。您的 write 函数从此缓冲区获取数据并将其异步写入套接字。您的写入处理程序调用您的写入函数。

【讨论】:

    【解决方案2】:

    当我async_write()到socket中多线程应用数据 可能被写入损坏。并且 Strand 保证这些都不是 处理程序将同时执行。

    如果多个线程需要在套接字上写入数据,则必须确保数据的顺序。这在async_write() documentation 中明确明确。

    程序必须确保流不执行其他写入 操作(例如 async_write,流的 async_write_some 函数或任何其他执行写入的组合操作)直到 此操作完成。

    我建议维护一个传出消息队列,这与this question 和我的answer 非常相似。

    【讨论】:

      猜你喜欢
      • 2011-12-05
      • 2012-11-10
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      • 1970-01-01
      • 1970-01-01
      • 2012-01-16
      • 2016-10-27
      相关资源
      最近更新 更多