在我的项目的最近的发展中,我用std::future
与async_read_some
,使调用者,说用户线程,可以等待异步I/O的特定持续时间,并出现像一个同步程序。但是调用获取std :: future对象async_read_some函数在远程连接对等点损坏的情况下不会返回。看起来,异步操作中的系统错误根本没有传播。程序读取异步升压asio与C + + 11未来
std::future<size_t> result=socket.async_read_some(boost::asio::buffer(data, size), boost::asio::use_future);
std::future_status status=result.wait_for(std::chrono::millisecond(1000));
switch(status){
case std::future_status::ready:
try{
bytes=result.get(); /* never returns in case of peer disconnection */
}catch(std::system_error & error){
/* print something only if error is caught */
}
break;
case std::future_status::timeout:
...
case std::future_status::deferred:
...
};
程序运行中根据情况下,处理“汇” - 它看起来酷似有死锁在ASIO实现。一丝执行std::future::get()
/// Wait for the state to be ready and rethrow any stored exception
__result_type
_M_get_result() const
{
_State_base::_S_check(_M_state);
_Result_base& __res = _M_state->wait();
if (!(__res._M_error == 0))
--> rethrow_exception(__res._M_error); <-- //deepest trace with available source
return static_cast<__result_type>(__res);
}
停止调查到的文件后,我发现很少说话
std::future<std::size_t> my_future = my_socket.async_read_some(my_buffer, boost::asio::use_future);
发起功能(async_read_some在上面的例子中)返回一个未来将接收操作结果。如果操作完成且error_code指示失败,则它将转换为system_error并通过未来传回给调用者。
但是,没有什么我的程序捕获周围result.get()
。
PS: linux 3.8.0-37-generiC#53~precise1-Ubuntu SMP Wed Feb 19 21:39:14 UTC 2014 i686 i686 i386 GNU/Linux
“看起来异步操作中的系统错误没有像所述的那样传播。” 内部asio使用std :: promise来创建返回的将来。阿西奥不会介绍一些神奇的未来的东西。这个未来必须处于就绪状态才能到达你的try/catch块,这意味着异常是由asio设置的,或者值是由asio设置的。所以错误不能在那里。 再次检查你对这个未来物体的使用情况,可能你正在做一些错误的操作。 – inkooboo
@inkooboo对不起,这个故事对你来说可能显得模糊不清,但实际上,它只在远程对等损坏之前返回正常。如果有人能够解释我asio如何转换system_error并通过未来传回给调用者,这将会有所帮助。 –
您可以查看源代码“boost/asio/impl/use_future.hpp”以获取更多想法。 当您将'boost :: asio :: use_future'作为'async_read_some'的完成处理程序传递时,asio将'promise_handler'的对象创建为完成处理程序。返回的将来是根据它的承诺创建的(请参阅async_result类模板特化)。 你可以尝试在这个文件中设置一些断点,然后尝试调试。可能会有所帮助。 – inkooboo