1

我有一个方法可以为新连接启动一个新的 std::thread ,这样我就可以读取数据并做其他事情。线程调用的方法以异步方式(使用 boost 函数)运行读取,并在调用后返回async_read_some,我的问题是:

哪个线程处理回调?是同一个线程调用了async_read_some还是该线程在调用它并返回之后死了,现在主线程正在处理读取?

这是一个代码片段:

    connection::connection_thread = std::thread(&connection::read_header,
                                                 this);
    connection::connection_thread.detach();
               .
               .
               .
  void connection::read_header() {
    socket_.async_read_some(boost::asio::buffer(headbuf_),
      strand_.wrap(
        boost::bind(&connection::on_header_read, shared_from_this(),
          boost::asio::placeholders::error,
          boost::asio::placeholders::bytes_transferred)));
    begin_timeout();
  }
4

1 回答 1

1

哪个线程处理回调?

轮询或运行关联的io_service. 处理程序被传递给服务以在完成时调用。

是调用 async_read_some 的同一个线程

不,async函数从不直接调用处理程序;它总是由 调用io_service,即使操作立即完成。

还是该线程在调用它并返回后就死了,现在主线程正在处理读取?

这完全取决于您如何管理线程。async如果您不再需要它,调用的线程可能会死掉;您将需要一些其他线程或线程(可能是主线程,也可能是其他线程)来处理io_service并完成异步操作。

但是,启动一个线程来启动一个异步操作是没有意义的,因为它会立即完成。将调用移至async_read_some您当前启动线程的位置;或使用线程执行同步操作。如果您选择多线程同步设计,那么您将不需要线程来轮询io_service异步操作。

于 2013-09-10T16:45:02.917 回答