带线程的异步方法

时间:2013-09-10 16:39:21

标签: c++ multithreading boost asynchronous boost-asio

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

1 个答案:

答案 0 :(得分:1)

  

什么线程处理回叫?

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

  

是与调用async_read_some

相同的线程

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

  

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

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

但是,没有必要启动一个线程来启动异步操作,因为这将立即完成。将呼叫移至async_read_some到您当前正在启动该线程的位置;或使用该线程执行同步操作。如果您选择多线程同步设计,那么您将不需要线程来轮询io_service进行异步操作。