需要关于Rust细胞和参考计数types的整体解释
我迷失在std::cell
模块中的types。 我也试图理解Rust中引用计数的包装,比如Rc
和Arc
。
据我了解,这是提供进一步的可能性比简单的参考包装。 虽然我理解基础知识( RefCell
给出了“dynamic借用”,而Rc
在C ++中就像shared_ptr
一样),但我仍然无法看到整个图像。
Rc
和Arc
什么联系? 细胞和参考计数的家庭提供正交function?
Rust中有两个基本概念:
- 所有权,
- 可变性。
各种指针types( Box
, Rc
, Arc
)都与拥有权有关:它们允许控制单个对象是否有单个或多个所有者。
另一方面,各种细胞( Cell
, RefCell
, Mutex
, RwLock
, AtomicXXX
)都与可变性有关。
Rust安全的创立规则是别名XOR Mutability 。 也就是说,如果没有对其内部的未完成引用,则只能安全地进行变异。
这个规则通常在编译时由借用检查器强制执行:
- 如果你有一个
&T
,你也不能在同一个对象的范围内有一个&mut T
, - 如果你有一个
&mut T
,你也不能在范围内引用同一个对象。
但是,有时候这还不够灵活。 有时你需要(或想要)具有对同一个对象的多个引用并且对其进行变异的能力。 input单元格 。
Cell
和RefCell
的想法是在受到混淆的情况下以受控方式允许可变性:
-
Cell
防止形成其内部的参考,避免悬挂参考, -
RefCell
将混叠XOR可变性的实施从编译时间转移到运行时间。
这个function有时被描述为提供内部可变性 ,也就是说,从外部( &T
)看起来不可变的对象实际上可以被突变。
当这个可变性扩展到多个线程时,您将使用Mutex
, RwLock
或AtomicXXX
; 他们提供相同的function:
-
AtomicXXX
只是Cell
:没有参考的内部,只是进出/ -
RwLock
只是RefCell
:通过卫兵可以获得内部的引用, -
Mutex
是RwLock
的简化版本,它不区分只读保护和写保护; 所以在概念上类似于仅具有borrow_mut
方法的borrow_mut
。
如果你来自C ++的背景:
-
Box
是unique_ptr
, -
Arc
是shared_ptr
, -
Rc
是shared_ptr
的非线程安全版本。
单元提供了类似于mutable
function,除了额外的保证来避免别名问题。 把Cell
看作是std::atomic
, RefCell
是std::shared_mutex
的非线程安全版本(如果发生locking,则抛出而不是阻塞)。