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