在我的例子中,如何将引用移动到新的线程中?

// How can I move reference into new thread?

pub mod tds {
        use std::thread;
        use std::thread::JoinHandle;

        pub fn f(sts: &u8) -> JoinHandle<()> {
            thread::spawn(move || {
                *sts = 88;
                println!("flow: {:?}", sts);
            })
        }
}


fn main() {
    let mut sts: u8 = 5;
    let handle = tds::f(&sts);

    println!("main_01: {:?}", sts);

    handle.join().unwrap();
    
    println!("main_02: {:?}", sts);
}

我找到了一些链接,但无法申请,text

一种解决方案是作用域线程--保证在父线程退出之前退出的线程.这可以确保父线程中的堆栈变量在整个线程持续时间内都可用.

example_01

example_02

example_03

推荐答案

您不能从作用域线程返回JoinHandle.当thread::scope()的回调自动返回时,它们会加入,这是无法阻止的.如果您希望在联接代码之前执行某些代码,则需要将其从main()移到tds::f().

正如@isaactfa所说,您也不能改变共享引用.你需要拿&mut i32美元.

代码的另一个问题是,当另一个线程正在改变它时,您不能读取sts.这可能会导致一场数据竞赛,这在Rust是被禁止的.为此,您需要使用原子技术.

Rust相关问答推荐

给定使用newype习语定义的类型上的铁 rust Vec,有没有方法获得底层原始类型的一部分?

如何将`Join_all``Vec<;Result<;Vec<;Foo&>;,Anywhere::Error&>;`合并到`Result<;Vec<;Foo&>;,Anywhere::Error&>;`

无法理解铁 rust &S错误处理

防止cargo test 中的竞争条件

铁 rust 中的共享对象实现特征

默认特征实现中的生命周期问题

rust 蚀生命周期 不匹配-不一定超过此处定义的生命周期

Tokio';s io::用Cursor拆分<;Vec<;u8>>;赢得';t get the full writted data

我应该如何表达具有生命周期参数的类型的总排序,同时允许与不同生命周期进行比较?

找不到 .has_func 或 .get_func 的 def

类型生命周期绑定的目的是什么?

我可以禁用发布模式的开发依赖功能吗?

如何在Rust中使用Serde创建一个自定义的反序列化器来处理带有内部标记的枚举

Rust编译器通过哪些规则来确保锁被释放?

我什么时候应该使用特征作为 Rust 的类型?

在构建器模式中捕获 &str 时如何使用生命周期?

使用 HashMap 条目时如何避免字符串键的短暂克隆?

是否有适当的方法在参考 1D 中转换 2D 数组

如何断言代码不会在测试中编译?

基于名称是否存在的条件编译