2016-07-05 57 views
0

以下代码是否安全?异步调用后删除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(...)而不是有所作为

我对这两个窗口和Linux感兴趣。

+0

做'插座的recv()'会导致您的调用线程阻塞,直到你的插座...这可能永远也发生在接收消息。 – Arunmu

+0

@Arunmu oops,改变了recv async_receive – doron

+0

我不认为这是一个好主意。任何你想在读取之前关闭套接字的原因(可能)在那个套接字上?你可以在你读取处理程序时关闭套接字,或者在套接字上做一个'cancel'并设置一个超时值,然后关闭它。 – Arunmu

回答

0

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

虽然线程存在问题。由于类型不是线程安全,因此您正在访问另一个socket成员时无法调用析构函数。

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

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