需要关于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的非线程安全版本。
单元提供了类似于mutablefunction,除了额外的保证来避免别名问题。 把Cell看作是std::atomic , RefCell是std::shared_mutex的非线程安全版本(如果发生locking,则抛出而不是阻塞)。