Rust 标准库中提供的一种线程安全的引用计数智能指针类型,位于 std::sync 模块中。Arc 的主要用途是在多线程环境下安全地共享不可变数据。 Arc 实现了内部共享对象的引用计数,当也只有当引用计数为零时,才会释放该对象。

先new 一个arc对象, 然后, 调用Arc::clone();
fn clone(&self) -> Arc<T, A> {} , 这个Arc的clone 方法定义, 必须传递一个引用。
因为,clone是arc的一个方法。所以,list_arc.clone()也是可以的。

 let list = vec![1, 2, 3];
    let list_arc = Arc::new(list);
    let mut handles = vec![];
    for i in 1..3 {
        let arc_clone = Arc::clone(&list_arc);
        let handle = thread::spawn(move || {
            println!("{:?}", arc_clone);
        });
        handles.push(handle);
    }
    //即使不join ,线程也会执行,目前的方式数量的计算是不安全的。
    for handle in handles {
        handle.join().unwrap();
    }
    //所有权还在
    println!("{:?}", list_arc);

new之后, 引用计数为1

let list_arc = Arc::new(list);
println!("{:?}", Arc::strong_count(&list_arc));
println!("{:?}", Arc::weak_count(&list_arc));

try_unwrap: 尝试将 Arc 转换回原值,如果只有一个强引用,则成功,否则返回 Err
消耗arc的所有权
pub fn try_unwrap(this: Self) -> Result<T, Self> {}

let x = Arc::new(3);
assert_eq!(Arc::try_unwrap(x), Ok(3));

返回一个可变的引用, 这个方法也挺有用的。

let mut arc = Arc::new(42);
// let arc1 = arc.clone();
let option = Arc::get_mut(&mut arc).unwrap();
*option=32;
println!("{}", option);
println!("{}", option)

判断

let mut arc = Arc::new("hello".to_owned());
let mut arc02 = Arc::new("hello".to_owned());
// let arc1 = arc.clone();
let option = Arc::get_mut(&mut arc).unwrap();
*option = "world".to_string();
println!("{}", option);
println!("{}", option);
let mut_ref = Arc::make_mut(&mut arc);
*mut_ref = "putao".to_string();
println!("{}", mut_ref);
println!("{}", Arc::ptr_eq(&arc, &arc02));

putao
8 声望1 粉丝

推动世界向前发展,改善民生。


« 上一篇
rust--迭代器
下一篇 »
rust--函数