gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 03:22:12 28 4
gpt4 key购买 nike

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

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 级联中是可变的;换句话说,如果“master-containing”对象是不可变的,那么其余的对象也必须是不可变的。

我能否弄清楚幕后发生的事情?
或者他们的代码也有错误?

最佳答案

From my prior knowledge, mutable in Rust cascades; in other words, if the "master-containing" object is immutable the rest will have to be too.

这几乎总是正确的...直到我们考虑 interior mutability .

内部可变性就是这样:通过共享引用更改值。此外,虽然还有其他共享引用。基本的内部可变性原语是 UnsafeCell , 但有多个抽象建立在它之上 - 其中之一是 RwLock (你可以看到 it secretly contains an UnsafeCell )。

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

关于rust - 如果 `write` 不可变, `RwLock` 模式如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72784788/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com