Mis*_*rov 5 rust rwlock borrow-checker
假设我们声明了一个不可变(not let mut)RwLock实例,例如:
let value = RwLock::new(0);
Run Code Online (Sandbox Code Playgroud)
因为value是不可变的,所以我预计我无法更改 的内部值RwLock。然而,当我测试时,显然这是有效的:
{
*value.write().unwrap() = 5;
}
Run Code Online (Sandbox Code Playgroud)
我想知道我是否使用了RwLock错误的方式,这不应该发生(我担心锁实际上可能无法按预期工作,如果是这种情况)。然而,我确信这种行为背后有一些解释,因为 Rust 在涉及可以更改和不可更改的内容时非常明确。
我的猜测是,它将RwLock其内部值存储在堆上,因此它只需要跟踪指向该值的不可变指针。因此,每当我们写入该值时,RwLock结构本身都将保持不变,因为指针不会改变。
这只是一种猜测,而且很可能是错误的。如果有人愿意纠正我,我会非常高兴。
澄清一下:我知道读写锁应该如何工作。我的问题不是关于同步机制,而是为什么 RustRwLock在不变性方面不像任何其他值一样对待值。就像它是编译器以不同方式对待的“魔法”类型之一,或者还有其他我不知道的东西。
RwLock因为就编译器而言,您没有改变。
将RwLock::write()a&self作为接收者并返回 a,-implRwLockWriteGuard用于对其进行赋值。这些步骤之间发生的事情取决于 的实施。DerefMut*value... = 5RwLock
由于您具体询问的不是RwLock其本身,而是“魔法”是否存在:对于不可变 ( &) 或可变 ( &mut) 引用,这里绝对不涉及任何魔法。事实上,可能存在误解:
虽然我们称这些为“不可变”或“可变”(因为这就是它们的使用方式),但最好将它们视为“共享”和“独占”引用。使用独占引用 ( &mut),您始终可以自由地改变值,而不会导致别名改变;编译器可以保证这个(特殊)用例。同样,对于共享引用 ( &),您可以自由地为该值添加别名,因为不可能发生突变。编译器也可以保证这种(特殊)情况。
虽然这涵盖了数量惊人的大量情况,但这RwLock既不可能也不可取。它RwLock使用它的内部锁定机制(编译器无法知道)来确定是否应该允许突变,并保证不会发生别名变化。这就是为什么RwLock可以从 a&self到改变内在价值。
顺便说一句,对于 -type 来说也是如此RefCell。
| 归档时间: |
|
| 查看次数: |
183 次 |
| 最近记录: |