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

C++ 单线程和多线程进程中的boost.asio复合操作,c++,multithreading,boost,boost-asio,C++,Multithreading,Boost,Boost Asio,关于boost.asio复合操作,有几点我在官方文档和我读过的关于这个主题的各种线程中都不清楚 场景 两个boost::asio::async_write请求A和B被安排在一个TCP套接字上 问题 在单线程进程中,是否会发生a与B同时执行的情况?也就是说,对A的async\u write\u一些的中间调用与B的调用混合在一起(这实际上是一个损坏的流) 如果(1)的答案是肯定的,那么io_service::strand是否在单线程过程中解决了该问题?它是否确保A的所有中间调用在B启动之前完成 当多

关于boost.asio复合操作,有几点我在官方文档和我读过的关于这个主题的各种线程中都不清楚

场景

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

问题

  • 在单线程进程中,是否会发生a与B同时执行的情况?也就是说,对A的
    async\u write\u一些
    的中间调用与B的调用混合在一起(这实际上是一个损坏的流)
  • 如果(1)的答案是肯定的,那么
    io_service::strand
    是否在单线程过程中解决了该问题?它是否确保A的所有中间调用在B启动之前完成
  • 当多个线程执行时,
    io_service::run()
    是否解决了多线程进程中的(1)问题?它是否确保A的所有中间调用在B启动之前完成

  • 文件明确规定:

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


    如果
    io\u service::run
    在多个线程中运行,只需将
    async\u write
    的完成处理程序通过
    进行包装,并将所有中间内部处理程序都打包。

    我相信“在前一个的完成处理程序中调用后续的async\u write”还解决了多线程情况,而无需包装handler@igor-r是你的asnwer 1。是的。第三。不。不?@rbk是的,如果说“它会发生吗…”你的意思是“它会发生吗,如果被滥用…”。文档非常清楚,真的。它可能看起来不清楚,但这是因为你头脑中有一些“不清楚的话题”,例如,前演员模式!总之,在我自己的学习过程中,帮助我的一个顶级问题/答案是。这提供了一个解决方案,通过使用队列序列化多个
    async\u write()
    操作,并在一个队列中使用异步调用链处理队列,同时满足
    async\u write()的要求
    和流的线程安全性。