具有线程的异步方法

Async methods with threads

本文关键字:异步方法 线程      更新时间:2023-10-16

我有一个方法可以为新连接启动一个新的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();
  }

什么线程处理回调?

轮询或运行关联io_service的线程(或其中一个线程,如果有多个线程)。处理程序将传递给要在完成时调用的服务。

是调用async_read_some的同一线程

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

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

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

但是,启动

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