繁体   English   中英

如果 `RwLock` 不可变,`write` 模式如何工作?

[英]How does `write` mode on a `RwLock` work if it isn't mutable?

所以,我正在编写一些代码,显然 RA 并没有警告我关于所有权如何与 lambda 一起使用的一些错误内容。
所以,一个朋友帮我重写了一些代码,这只是一个游戏示例,但他们的新代码归结为:

let vec = Rc::new(RwLock::new( Vec::new() ));
let vec_rc = vec.clone();
let my_lambda = || -> () {
  vec_rc.write().unwrap().push(/* ... */);
}

但我不明白的是,如果vec_rc不是mut ,这是如何工作的。
根据我的先验知识,在 Rust 级联中是可变的; 换句话说,如果“包含主”的对象是不可变的,那么其余的也必须是。

我能否弄清楚引擎盖下发生了什么?
还是他们的代码也是错误的?

根据我的先验知识,在 Rust 级联中是可变的; 换句话说,如果“包含主”的对象是不可变的,那么其余的也必须是。

这几乎总是正确的......直到我们考虑内部可变性

内部可变性正是关于这一点:通过共享引用更改值。 此外,虽然还有其他共享引用。 基本的内部可变性原语是UnsafeCell ,但在它之上构建了多个抽象——其中之一是RwLock (你可以看到它秘密地包含一个UnsafeCell )。

作为旁注, Rc<RwLock<T>>几乎总是错误的: Rc是非线程安全的,这违背了RwLock的全部目的。 如果您只需要在一个线程上声明共享可变,请使用Rc<RefCell<T>> 它的性能要高得多并且不能阻塞(所以没有死锁调试,如果出现问题只是一个简单的恐慌)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM