具有线程的异步方法
Async methods with threads
我有一个方法可以为新连接启动一个新的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
。
相关文章:
- 方法重写线程C++中的概念
- 使用基类中的派生方法运行线程,而无需使用模板
- 将线程中的数据存储到全局容器的最佳方法?
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 如何在C++上启动异步线程
- 如何将带有参数的方法传递给线程以执行?
- C++ POCO - 如何在不使用 run() 方法的情况下启动线程池上的线程?
- 在销毁期间从另一个线程调用对象上调用方法是否未定义行为?
- C++中的多线程:连接线程的正确方法
- 使用包含互斥锁的类的方法实例化 cpp11 线程
- 使用 std::chrono::steady_clock 对线程/异步中的代码进行基准测试
- 如何在JNI中从线程内部调用JAVA方法
- 调用boost.asio的异步函数时,线程是什么时候创建的
- 如何从另一个线程调用颤振引擎方法
- 在另一个线程上发出 QObject 信号的正确方法?
- 在C++线程内实现多个计时器的最安全方法
- C++ std::线程调用方法,从对象原因到调用此类的析构函数
- 在std ::线程中升级ASIO阻止操作,而不是使用异步方法
- 在 C++11 中使用期货、异步和线程实现搜索
- 使用异步方法vs线程等待