boost.asio单线程和多线程进程中的复合操作

时间:2014-06-24 05:01:33

标签: c++ multithreading boost boost-asio

有关boost.asio复合操作的一些事情,从官方文档和我读过的关于该主题的各种线程中都不清楚。

情景

在单个TCP套接字上安排了两个boost::asio::async_write个请求A和B.

问题

  1. 在单线程进程中,是否可能发生A与B同时执行?也就是说,对A的async_write_some的中间调用与B的调用(实际上是一个损坏的流)?
  2. 如果(1)的答案为是,io_service::strand是否在单线程进程中解决了问题?是否确保在B开始之前A的所有中间调用都已完成?
  3. 当多个线程执行io_service.strand时,io_service::run()是否解决了多线程进程中(1)的问题?是否确保在B开始之前A的所有中间调用都已完成?

1 个答案:

答案 0 :(得分:2)

文件明确说明:"The program must ensure that the stream performs no other write operations (such as async_write, the stream's async_write_some function, or any other composed operations that perform writes) until this operation completes."

因此,绝不能同时调用多个async_write。在单线程的情况下,可以链接它们,在前一个完成hanndler中调用后续的async_write

如果io_service::run在多个线程中运行,只需用async_write包裹strand的完成处理程序,然后用所有中间内部处理程序包装Asio will synchronize