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

时间:2016-07-05 09:55:48

标签: c++ linux windows boost-asio

以下代码是否安全?

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->async_receive(...)代替

我对Windows和Linux都感兴趣。

1 个答案:

答案 0 :(得分:0)

重置指针会调用套接字上的析构函数。析构函数显式取消任何异步操作,因此没问题。

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

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

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