首页 > 解决方案 > 如何在 Arc 中使用 TcpStream

问题描述

我有一个TcpStream,并且我正在尝试创建一个专用线程来读取,TcpStream并且主线程应该只进行写入,所以我将TcpStreamArc 包裹在内部以共享所有权。这是我的代码

fn main() {
    let mut tcp_stream = TcpStream::connect("127.0.0.1:8080").unwrap();
    let tcp_stream = Arc::new(&mut tcp_stream);
}
fn read_from_stream(tcp_stream: Arc<&mut TcpStream>) {
    let mut buffer = String::new();
    tcp_stream.read_to_string(&mut buffer);
}

我收到错误Cannot borrow data in Arc as mutable。但是tcp_stream为了调用read_to_string方法需要是可变的。我应该怎么做才能完成这项工作?

标签: rust

解决方案


虽然Arc确实抑制了可变性,但在这种情况下这不是问题,因为&TcpStream 实现 Read了.

因此,您可以包装TcpStream(不是&mut TcpStreamArc并调用通过以下方式获得read_to_string()的共享&TcpStream引用Arc::as_ref()

fn main() {
    let tcp_stream = TcpStream::connect("127.0.0.1:8080").unwrap();
    let tcp_stream = Arc::new(tcp_stream);
}

fn read_from_stream(tcp_stream: Arc<TcpStream>) {
    let mut buffer = String::new();
    tcp_stream.as_ref().read_to_string(&mut buffer);
}

操场


推荐阅读