进行异步调用后删除asio套接字

Posted

技术标签:

【中文标题】进行异步调用后删除asio套接字【英文标题】:Deleting asio socket after making async call 【发布时间】:2016-07-05 09:55:47 【问题描述】:

下面的代码安全吗?

boost::asio::io_service io_service;
auto socket(new std::unique_ptr<boost::asio::tcp::socket>(io_service);
.
.
.
boost::asio::async_read(*socket, buffer, handler);
socket.reset();

或者我是否需要等待处理程序运行才能删除套接字? 也将使用socket-&gt;async_receive(...) 来代替任何区别

我在 windows 和 linux 上都对此感兴趣。

【问题讨论】:

执行socket-recv() 将导致您的调用线程阻塞,直到您在套接字上收到消息...这也可能永远不会发生。 @Arunmu 哎呀,将 recv 更改为 async_receive 我认为这不是一个好主意。为什么要在该套接字上发生(可能)读取之前关闭套接字?您可以在读取处理程序中关闭套接字或设置超时,其中您在套接字上执行cancel 然后关闭它。 @Arunmu 用例是应用程序关闭。 嗯..这又提出了另一个问题,您是否希望套接字在整个运行时处于活动状态并且仅在关闭期间关闭?似乎更像是拥有创建套接字的析构函数的工作。 【参考方案1】:

重置指针调用套接字上的析构函数。析构函数显式取消任何异步操作,这很好。

不过,线程存在问题。在访问 socket 的另一个成员时,您不能调用析构函数,因为该类型不是线程安全的。

通常的关闭模式是对各自链上的 IO 对象(如套接字)进行 /post/ 操作,和/或 stop() 服务本身并等待服务线程返回。

还相关:Why do we need to use boost::asio::io_service::work?

【讨论】:

以上是关于进行异步调用后删除asio套接字的主要内容,如果未能解决你的问题,请参考以下文章

Windows上的Boost asio套接字无法异步连接

断开连接后正确杀死asio steady_timer

处理异步套接字(.Net)后仍然会调用回调

boost::asio 学习

从套接字和 STDIN 提升 Asio 多线程

是否通过链调用 ASIO 完成处理程序以取消操作?