我有一个方法可以为新连接启动一个新的 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();
}
最佳答案
What thread handles the call-back?
轮询或运行关联的 io_service
的线程(或线程之一,如果有多个线程) .处理程序传递给服务以在完成时调用。
Is is the same thread that made the call to the async_read_some
不,async
函数从不直接调用处理程序;它总是由 io_service
调用,即使操作立即完成也是如此。
or did that thread die after it called it and returned and now the main thread is handling the reads?
这完全取决于您如何管理线程。如果您不再需要调用 async
的线程,它可能会死掉;您将需要一些其他线程(可能是主线程,也可能是其他线程)来处理 io_service
并完成异步操作。
但是,启动线程来启动异步操作没有意义,因为它会立即完成。将对 async_read_some
的调用移动到您当前启动线程的位置;或使用线程执行同步 操作。如果您选择多线程同步设计,则不需要线程来轮询 io_service
以进行异步操作。
关于c++ - 带线程的异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18724487/