结构S实际上可能是一些大数据,例如大Vec。如果我只有一个线程,并且在创建线程后不使用数据,则可以将数据移至该线程,但是如果有两个线程(或在主线程中使用相同的数据),那是不可能的。

struct S {
    i : i32,
}

fn thr(s : &S)
{
}

fn main()
{
    let s1 = S { i:1 };
    thr(&s1);
    let t1 = std::thread::spawn(|| thr(&s1)); // does not work
    let t2 = std::thread::spawn(|| thr(&s1)); // does not work
    t1.join();
    t2.join();
}

最佳答案

我会高度建议阅读The Rust Programming Language,特别是chapter on concurrency。在其中,您被介绍给 Arc :

use std::sync::Arc;

struct S {
    i: i32,
}

fn thr(s: &S) {}

fn main() {
    let s1 = Arc::new(S { i: 1 });
    thr(&s1);

    let s2 = s1.clone();
    let t2 = std::thread::spawn(move || thr(&s2));

    let s3 = s1.clone();
    let t3 = std::thread::spawn(move || thr(&s3));

    t2.join();
    t3.join();
}

值得注意的是,克隆Arc时,它们只是增加引用计数,而不复制包含的数据。

10-01 19:55