如何在不复制的情况下将相同的数据传递给不同的线程?

Gen*_*rin 1 multithreading rust

Struct 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();
}
Run Code Online (Sandbox Code Playgroud)

She*_*ter 7

强烈推荐阅读Rust编程语言,特别是有关并发章节.在其中,您将了解到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();
}
Run Code Online (Sandbox Code Playgroud)

值得注意的是,当Arc克隆s 时,它们只是碰撞引用计数,而不是复制包含的数据.

  • @GennadyProskurin,因为所有线程都是独立的,所以根本无法避免"Arc".数据必须存储在某个地方(即某人必须拥有数据).因为线程是独立的,所以它们不能由任何人拥有 - 然后可以销毁这些数据,而其他线程仍然有它的句柄.如果线程是[作用域](http://doc.rust-lang.org/std/thread/fn.scoped.html),则可以解除此限制,但是`scoped` API对于一个重要的[原因]是不稳定的(https://github.com/rust-lang/rust/pull/24385). (5认同)