原文
空 干读()
{
动 本(从本共享());
套接字_.异步读些(提升::异网::缓冲(数据_,最大长度),[本,本](提升::系统::错误码 ec,大小型 长度){
如(!ec){
干写(长度);
}异{
关闭();
}
});
}
空 关闭(){
套接字_.关闭(异网::ip::传控::套接字::都关闭);
套接字_.关闭();
}//关闭.
只是在异步回调里,调用没问题,但如果在对象析构时调用关闭的话,那么就有问题,因为外面去关闭socket的时候,这时候可能正在读写数据,这样关闭可能导致无法收到和发送成功数据,另外一个问题是线程安全,asio不保证socket.close的线程安全.如果内部和外部同时调用关闭的话就有竞争,会发生未定义行为.
正确关闭,应通过io_context提交关闭到内部队列中,触发关闭时,说明无其它读写操作了,此时,关闭它是安全的.
空 关闭(){
io环境_.提交([本,本=从本共享()]{
套接字_.关闭(异网::ip::传控::套接字::都关闭);
套接字_.关闭();
});//提交.
}
再加上防重判断
空 关闭(){
如(有关闭_)中;
io环境_.提交([本,本=从本共享()]{
如(!套接字_.是打开())中;
套接字_.关闭(异网::ip::传控::套接字::都关闭);
套接字_.关闭();
});
有关闭_=真;
}
原子<极>有关闭_=假;










