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)
我强烈推荐阅读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 时,它们只是碰撞引用计数,而不是复制包含的数据.