将Arc <rwlock>转换为&amp; mut

时间:2016-12-01 16:30:02

标签: rust

我试图在一个可以通过引用变异的特征中获得一个值。问题是String值非常大并且可能被许多线程访问,所以我的解决方案看起来像这样:

trait MyTrait {
    fn name<'a>(&'a mut self) -> &'a mut String;
}

struct SimpleImpl {
    name: String
}

impl MyTrait for SimpleImpl {
    fn name<'a>(&'a mut self) -> &'a mut String {
        &mut self.name
    }
}

use std::sync::{Arc,RwLock};

struct ParallelImpl {
    name: Arc<RwLock<String>>
}

impl MyTrait for ParallelImpl {
    fn name<'a>(&'a mut self) -> &'a mut String {
        self.name.get_mut().unwrap()
    }
}

fn main() {
    let mut a = SimpleImpl { name: String::from("simple") };
    let mut b = ParallelImpl { name: Arc::new(RwLock::new(String::from("parallel"))) };

    a.name().as_mut_str();
    b.name().as_mut_str();
}

无法使用

进行编译
main2.rs:23:9: 23:18 error: cannot borrow immutable borrowed content as mutable
main2.rs:23         self.name.get_mut().unwrap()

为什么我不能致电get_mut()打开ArcRwLock

1 个答案:

答案 0 :(得分:5)

更好地了解RwLock

的界面

get_mut返回LockResult<&mut T>,这是一个保护对象。这种防护装置的销毁会自动解锁。

为了让事情变得安全,通过致电警卫&mut T获得的unwrap() 从警卫借用,即生命周期unwrap()的结果受到守卫的限制(因为在守卫被摧毁后,锁被解锁)。

在这里,你正在创建一个临时警卫并立即扔掉它,所以参考的生命周期不能超过函数的生命周期......

恭喜Rust!在编译时阻止了另一场数据竞争:)