let mut
)的RwLock
实例,如下所示:let value = RwLock::new(0);
由于value
是不可变的,我原以为我无法更改RwLock
的内部值。但是当我进行测试时,显然这是有效的:
{
*value.write().unwrap() = 5;
}
我在想我是否错误地使用了RwLock
,这种情况不应该发生(如果是这样的话,我担心锁可能无法按预期工作)。然而,我确信这种行为背后有一些解释,因为Rust在涉及可以更改什么和不能更改什么方面非常明确。
我的猜测是RwLock
将其内部值存储在堆上,因此它只需要跟踪对该值的不可变指针。因此,每当我们写入该值时,RwLock
结构本身将保持不变,因为指针不会改变。
这只是一个猜测,可能是错误的。如果有人愿意纠正我,我会非常高兴。
澄清一下:我知道 Reader-Writer 锁应该如何工作。我的问题不在于同步机制,而是为什么 Rust 在处理不可变性时不像对待其他值一样处理 RwLock 值。它是否是编译器处理的“神奇”类型之一,还是有其他我不知道的原因。
&
引用到同一数据的&mut
引用。允许这样做的魔法在于UnsafeCell
,它被编译器特殊处理,并作为内部可变性的基础,包括原子操作在内的所有其他东西。如果没有这个魔法,即使在不安全的代码中也无法实现内部可变性。 - user4815162342