以下代码是否安全?
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都感兴趣。
答案 0 :(得分:0)
重置指针会调用套接字上的析构函数。析构函数显式取消任何异步操作,因此没问题。
但是线程存在问题。在访问socket
的另一个成员时,您无法调用析构函数,因为该类型不是线程安全的。
通常的关闭模式是对各自链上的IO对象(如套接字)进行/ post / operations,和/或对stop()
服务本身进行操作,并等待服务线程返回。