向异步发送可变引用不会在异步关闭后将其返回

问题描述 投票:0回答:1

有一个流,我想继续从异步函数(通过 tokio 生成)向其中发送数据包,直到我的主 fn 收到用户输入。然后,包含生成的异步的运行时将关闭,另一个函数应将断开连接数据包发送到流中。

但是我收到一个错误,无法两次借用可变引用。但是接收到第一个可变引用的函数已经终止了,为什么我仍然不能借用新的引用呢?

这是我的主要功能:

fn main() -> io::Result<()> {
    
    let socket_path = "/run/user/1000/discord-ipc-0";
    let mut stream = UnixStream::connect(socket_path)?;

    let rt  = Runtime::new().unwrap();
    rt.spawn(update_presence(&mut stream));
    {
        let mut confirm = String::new();
        let _ = io::stdin().read_line(&mut confirm);
    }
    rt.shutdown_background(); 

    disconnect_stream(&mut stream)?;

    Ok(())

}

update_presence()
包含一个
loop{}
,它每隔几秒继续将数据包发送到流中,直到运行时关闭。

rust borrow-checker rust-tokio
1个回答
0
投票

您遇到的问题与 Rust 中的借用规则有关。即使函数 update_presence 已终止,流的借用仍然存在,直到调用disconnect_stream 的主函数结束为止。 Rust 不允许您同时对同一数据有多个可变引用,即使其中之一不再被使用。

为了解决这个问题,您可以将主函数分为两个作用域:一个用于 update_presence 函数,另一个用于用户输入和关闭逻辑。以下是修改代码的方法:

use std::io;
use tokio::net::UnixStream;
use tokio::runtime::Runtime;

fn main() -> io::Result<()> {
    let socket_path = "/run/user/1000/discord-ipc-0";
    let mut stream = UnixStream::connect(socket_path)?;

    let rt = Runtime::new().unwrap();
    rt.spawn(update_presence(&mut stream));

    {
        let mut confirm = String::new();
        let _ = io::stdin().read_line(&mut confirm);
    }

    rt.shutdown_background();

    disconnect_stream(&mut stream)?;

    Ok(())
}

这样,update_presence 的可变借用流包含在与disconnect_stream 的借用不同的范围内,从而解决了借用问题。

© www.soinside.com 2019 - 2024. All rights reserved.