执行哪些线程异步操作

时间:2017-11-13 20:42:54

标签: c++ multithreading boost boost-asio

在阅读asio的文档后,我很清楚完成处理程序是由一个调用io_service的io.run()方法的线程调用的。但是,我不清楚的是读/写异步方法发生在哪个线程。它是我调用方法的线程还是在调用io.run()方法的一个线程中?或者,在最后一种情况下,库是否在幕后创建另一个线程并执行操作?

2 个答案:

答案 0 :(得分:0)

例如,您希望将一些数据发送到远程伙伴 - 异步。

boost::asio::async_write(_socket, boost::asio::buffer(msg.data(), msg.size()),
    std::bind(&Socket::WriteHandlerInternal, this->shared_from_this(), std::placeholders::_1, std::placeholders::_2));
//Where 'this' is the class Socket

在此之前,您可能已经创建了一个名为ioService.run()的线程。 async_write函数将使用您用于创建套接字的ioService。它将ioService的队列放入执行写操作和处理程序 - ioService运行的线程上,正如async_已经建议的那样。

答案 1 :(得分:0)

将在初始async_*功能中尝试I / O操作。如果满足操作的完成条件或发生错误,则操作完成,完成处理程序将发布到io_service。否则,操作未完成,它将被排入io_service,其中运行io_service函数的应用程序线程poll()poll_one(),{{1 }或run()执行基础I / O操作。在这两种情况下,完成处理程序都由处理run_one()

的线程调用

async_write()文档指出异步操作可以立即完成:

  

无论异步操作是否立即完成,都不会从此函数中调用处理程序。调用处理程序的调用将以与使用io_service等效的方式执行。

Requirements on Asynchronous Operations文档中也注明了这种行为:

  

当异步操作完成时,将按以下方式调用操作的处理程序:

     
      
  • 为处理程序构建绑定完成处理程序boost::asio::io_service::post() ...
  •   
  • 调用bch来安排延迟调用的处理程序......
  •   
     

这意味着不能直接从启动函数中调用处理程序,即使异步操作立即完成。

以下是此行为的完整示例demonstrating。其中,ios.post(bch)socket1已关联。最初,socket2没有可用的数据。但是,在调用socket2之后,即使async_write(socket1, ...)尚未运行,socket2也有数据:

io_service