我有一个方法可以为新连接启动一个新的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();
}
答案 0 :(得分:1)
什么线程处理回叫?
线程(或其中一个线程,如果有多个线程)轮询或运行关联的io_service
。处理程序将传递给要在完成时调用的服务。
是与调用async_read_some
相同的线程
不,async
函数从不直接调用处理程序;它始终由io_service
调用,即使操作立即完成。
或者在调用它并返回之后该线程是否死亡,现在主线程正在处理读取?
这完全取决于你如何管理线程。如果您不再需要它,则调用async
的线程可能会死亡;你需要一些其他线程或线程(可能是主线程,可能是其他线程)来处理io_service
并完成异步操作。
但是,没有必要启动一个线程来启动异步操作,因为这将立即完成。将呼叫移至async_read_some
到您当前正在启动该线程的位置;或使用该线程执行同步操作。如果您选择多线程同步设计,那么您将不需要线程来轮询io_service
进行异步操作。