在单个线程异步系统中同时发出多个请求时,野兽增强异步http客户端在 c ++ 11 中如何工作?
使用案例:
我想发送多个同时异步请求,并且我正在为每个请求创建新的http客户端。当收到任何请求的响应时,我将调用一个回调函数,该函数 在收到响应的1秒后删除客户端 ,以避免任何内存泄漏。但是,即使我为每个请求都创建了一个新的客户端对象,似乎在经过一定数量的模拟http请求之后,系统/代码也仍然处于挂起状态。野兽助推会使用某些共享资源吗,因为此暂停看起来系统处于无限死锁中。 PS:我也尝试注释此删除块,但是系统的行为也一样。
以下是boost和编译器版本的规范:
提升:稳定1.68.0
BOOST_BEAST_VERSION 181
clang -v
clang version 6.0.0-1ubuntu2 (tags/RELEASE_600/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
void sendHttpRequest(){
HttpClient *client = new HttpClient();
deleteClient = [this,client]{
int timeout = 1;
boost::asio::deadline_timer *clientDeleteTimer = new boost::asio::deadline_timer( *this->context);
clientDeleteTimer->expires_from_now(boost::posix_time::seconds(timeout));
clientDeleteTimer->async_wait([client,this,clientDeleteTimer](const boost::system::error_code &ec){
if(ec == boost::asio::error::operation_aborted){
std::cout<<" Operation aborted\n"<<std::flush;
return;
}
else{
delete client;
}
delete clientDeleteTimer;
};
callback = [] {
std::cout<<"Response recieved successfully\n"<<std::flush;
deleteClient();
};
errback = [] {
std::cout<<"Response not recieved \n"<<std::flush;
deleteClient();
};
client.sendPostRequest(request, callback , errback);
}
上面的此函数是一个包装函数,将为每个请求调用该函数,并在内部创建新的http异步客户端,并在收到1秒的响应/错误(基本上已处理了请求)后删除该客户端对象。