[英]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.