当前位置: 代码迷 >> 综合 >> Rust 的多线程安全引用 Arc
  详细解决方案

Rust 的多线程安全引用 Arc

热度:78   发布时间:2023-12-12 15:22:19.0

Rust 的多线程安全引用 Arc

作者: 许野平

1 Arc 与 Rc 几乎一样,但是多线程安全的

Arc 与 Rc 类似,唯一不同的地方在于 Arc 是多线程安全的。参见下面的例子:

use std::sync::Arc;
use std::thread;fn main() {
    let nums = Arc::new(vec![0, 1, 2, 3, 4]);let mut childs = vec![];for n in 0..5 {
    let ns = nums.clone();let c = thread::spawn(move || println!("{:?}", ns[n]));childs.push(c);}for c in childs {
    c.join().unwrap();}
}
-------------------------------------------------------------------------------
>cargo run
0
2
4
1
3

2 Arc 可以打破只读的魔咒

Arc、Rc 都是只读的共享。但是,这个所谓的只读,仅仅是语法层面的。我们可以构造语法结构上是只读的,但实际上允许修改的数据类型。Mutex 就是一个这样的引用类型。看代码吧:

use std::sync::{
    Arc, Mutex};
use std::thread;fn main() {
    let nums = Arc::new(Mutex::new(vec![]));let mut childs = vec![];for n in 0..5 {
    let ns = nums.clone();let c = thread::spawn(move || {
    let mut v = ns.lock().unwrap();v.push(n);});childs.push(c);}for c in childs {
    c.join().unwrap();}println!("{:?}", nums);
}
-------------------------------------------------------------------------------
>cargo run
Mutex {
     data: [0, 1, 3, 2, 4], poisoned: false, .. }