2014-06-24 25 views
0

关于boost.asio复合操作有几点不清楚,这些操作在官方文档和我已阅读的主题中的各种线程中都不清楚。boost.asio在单线程和多线程进程中的复合操作

场景

两个boost::asio::async_write请求A和B被安排在一个TCP套接字。

问题

  1. 在单线程处理中,可能发生的是A被同时地B所执行?也就是说,A的async_write_some的中间调用与B的调用(基本上呈现损坏的流)混合?
  2. 如果(1)的答案为是,那么io_service::strand是否解决了单线程过程中的问题?它是否确保在B之前完成A的所有中间呼叫开始?
  3. 请问io_service.strand是否解决了(1)在多线程进程中,当多个线程执行io_service::run()?它是否确保在B之前完成A的所有中间呼叫开始?
+0

文档非常清晰,真的。它可能看起来不清楚,但这是因为你脑海中存在一些“不清楚的主题”,例如proactor模式!无论如何,topnotch SO问题/答案,帮助我在我自己的学习曲线之一是[那个](http://stackoverflow.com/questions/15568100/confused-when-boostasioio-service-run-method-blocks-unblocks ?RQ = 1)。 –

+0

This [answer](http://stackoverflow.com/a/7756894/1053968)通过使用一个队列来序列化多个'async_write()'操作,并用一个异步调用链处理队列一个['strand'](http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/reference/io_service__strand.html),满足'async_write()'的要求和流的线程安全。 –

回答

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的绝不能同时调用。在一个单线程的情况下,可以链接它们,在前一个完成处理程序中调用后续的async_write

如果io_service::run在多个线程中运行时,仅通过一个strand包裹async_write的完成处理程序,和ASIO will synchronize所有的中间内部处理程序。

+0

我相信“在前一个完成处理程序中调用随后的async_write”也可以解决多线程情况,而不必包装处理程序 – kispaljr

+0

@ igor -r是您的asnwer 1.是2.否否3.否否? – rbk

+0

@rbk是的,如果说“可以发生......”,那么你的意思是“如果滥用......可以发生......”。 –