【问题标题】:How to execute async operations sequentially with c++ boost::asio?如何使用 c++ boost::asio 顺序执行异步操作?
【发布时间】:2011-12-24 03:21:46
【问题描述】:

我想有一种方法可以从多个线程中添加异步任务,并在 c++ boost::asio 应用程序中按顺序执行它们。

更新:我想进行服务器到服务器通信,它们之间只有一个持久套接字,我需要通过它对多个请求进行排序。它需要将传入的请求保留在队列中,触发顶部的请求/等待它的响应并获取下一个请求。我试图避免使用zeromq,因为它需要一个专用线程。

Update2: 好的,这就是我最终的结果:并发工作线程被“排队”以使用具有简单互斥锁的服务器到服务器套接字。通信阻塞写入/等待响应/读取,然后释放互斥锁。是不是很简单:)

【问题讨论】:

  • 我也想拥有它!

标签: c++ boost


【解决方案1】:

来自 ASIO documentation

异步完成处理程序只会从线程调用 当前正在调用 io_service::run()。

如果您已经从多个线程调用io_service::run(),您可以将异步调用包装在io_service::strand 中,如here 所述。

【讨论】:

  • 实际上 strand 只对同步任务进行排序。您不能使用 strand 对异步任务进行排序。这是一个例子。服务接收请求,它需要请求辅助服务来完成请求。我想一次将请求排序到辅助服务一个异步请求/异步响应。
  • @Roskoto:我认为这不是真的。如果您查看 Timer 5 示例,则使用一个 strand 来同步对两个不同线程中两个不同 deadline_timer 的 async_wait() 的调用。当您谈到辅助服务时,您是在谈论另一个 io_service 对象吗?如果是这样,也许解决方案是使用由您的线程共享的单个 io_service 对象。然后你应该能够使用一个链来同步你的异步任务。还是我不明白什么?
  • 我不认为 Timer.5 是一个很好的例子。它同时启动两个计时器并且只同步响应。是的,我只有一个 io_service 在多个线程中运行
  • @Roskoto:我看到您添加了一些有关您要完成的工作的更多信息,但我想我只是不明白。我希望我能提供更多帮助。
【解决方案2】:

也不确定我是否理解正确,但client chat example 中的方法有什么问题?消息发布到 io_service 线程,在写入过程中排队并在写入完成处理程序中弹出/发送。如果同时添加了更多消息,则写入处理程序将启动下一个异步写入。

根据您对 Sean 的评论,我也不明白让多个线程调用 io_service::run 的好处,因为您一次只能在一个持久套接字上执行一个 async_write/async_read,即您只能再次调用 async_write一旦处理程序返回?不过,调用线程的数量可能需要您使用互斥锁锁定队列。

AFAICT 让多个线程调用 io_service::run 的好处是增加了同时服务多个请求的服务器的可伸缩性。

【讨论】:

  • 该示例仅对请求进行排序而不等待任何响应。
  • @Roskoto:“响应”是指对服务器写入的响应吗?如果是这样,您也可以在写完成处理程序中启动 async_read 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多