rust学习(tokio中tcp_stream调用的问题)

问题:

我们涉及了一个socket连接的类,每次收到数据以后,我们都会把tokio::net::TcpStream对应的tcp_stream传递给其他线程。

起初设计如下:

rust 复制代码
pub struct TarNetStream {
    stream:TcpStream, //1
    ...
}

pub trait TarListener {
    fn on_event(&self,event:Event,data:Option<Vec<u8>>,stream:Arc<Box<TarNetStream>>); //2
}

1.stream直接move给TarNetStream

2.回调函数中采用了Arc智能指针

问题1:由于stream被move了,所以多线程编译会直接报错。

改进1:将成员变量变成Arc>(由于stream的read/write都需要mut权限,所以这里需要用refcell)

rust 复制代码
pub struct TarNetStream {
   stream:Arc<RefCell<TcpStream>>,
}

问题2:正常都能使用,但是多线程调用的时候会提示Refcell不能再多线程中使用

改进2:添加mutex锁

rust 复制代码
pub struct TarNetStream {
   stream:Arc<tokio::sync::Mutex<RefCell<TcpStream>>>,
}

问题3:运行直接卡死。原因如下:

rust 复制代码
线程1运行读:
let obj = stream.lock().await;
let result = obj.try_borrow_mut().unwrap().read(&mut buf).await;//1

线程2运行写:
let obj = stream.lock().await;//2
let result = obj.try_borrow_mut().unwrap().write(buf).await;

1.没有数据,这里卡死

2.由于线程1一直在等数据,所以线程2只能在这里2处卡住。

改进4:读写分离

rust 复制代码
pub struct TarNetStream<'a>'> {
    //stream:Arc<RefCell<TcpStream>>,
    read_stream:tokio::sync::Mutex<tokio::net::tcp::ReadHalf<'a'>>>,
    write_stream:tokio::sync::Mutex<WriteHalf<'a'>>>,
    ...
}

问题4:异步线程调用时候编译提示生命周期有问题,应该是ReadHalf/WriteHalf里面存放的是stream的引用,多线程情况下会出现问题,所以直接编译报错?

改进4:移除生命周期,采用OwnerReadHalf/WriteHalf

rust 复制代码
pub struct TarNetStream {
    //stream:Arc<RefCell<TcpStream>>,
    read_stream:tokio::sync::Mutex<tokio::net::tcp::OwnedReadHalf>,
    write_stream:tokio::sync::Mutex<OwnedWriteHalf>,
    ...
}

备考:

如果需要使用OwnedWriteHalf/OwnedReadHalf,需要类似如下的调用:

相关推荐
deng-c-f2 小时前
Linux C/C++ 学习日记(28):KCP协议(四):如何实现更复杂的业务:将连接状态的管理进行封装,用户只需实现发送、接收、断开的处理逻辑。
学习·网络编程·kcp
立志成为大牛的小牛5 小时前
数据结构——二十三、并查集的终极优化(王道408)
开发语言·数据结构·笔记·学习·程序人生·考研
QT 小鲜肉6 小时前
【个人成长笔记】Qt Creator快捷键终极指南:从入门到精通
开发语言·c++·笔记·qt·学习·学习方法
代码AI弗森7 小时前
无状态的智慧:从 HTTP 到大模型的系统进化论
网络·网络协议·http
酷熊代理8 小时前
安卓手机 IP 切换指南:告别卡顿,轻松换 IP
网络·网络协议·tcp/ip·socks5
不做菜鸟的网工8 小时前
PIM SM +MSDP 组播跨域配置案例
网络协议
QT 小鲜肉8 小时前
【数据结构与算法基础】05. 栈详解(C++ 实战)
开发语言·数据结构·c++·笔记·学习·算法·学习方法
A9better9 小时前
嵌入式开发学习日志40——stm32之I2C协议层
stm32·单片机·嵌入式硬件·学习
ha20428941949 小时前
Linux操作系统学习之---线程控制
java·linux·学习
大面积秃头10 小时前
Http基础协议和解析
网络·网络协议·http