需要关于Rust细胞和参考计数types的整体解释

我迷失在std::cell模块中的types。 我也试图理解Rust中引用计数的包装,比如RcArc

据我了解,这是提供进一步的可能性比简单的参考包装。 虽然我理解基础知识( RefCell给出了“dynamic借用”,而Rc在C ++中就像shared_ptr一样),但我仍然无法看到整个图像。

RcArc什么联系? 细胞和参考计数的家庭提供正交function?

Rust中有两个基本概念:

  • 所有权,
  • 可变性。

各种指针types( BoxRcArc )都与拥有权有关:它们允许控制单个对象是否有单个或多个所有者。

另一方面,各种细胞( CellRefCellMutexRwLockAtomicXXX )都与可变性有关。


Rust安全的创立规则是别名XOR Mutability 。 也就是说,如果没有对其内部的未完成引用,则只能安全地进行变异。

这个规则通常在编译时由借用检查器强制执行:

  • 如果你有一个&T ,你也不能在同一个对象的范围内有一个&mut T
  • 如果你有一个&mut T ,你也不能在范围内引用同一个对象。

但是,有时候这还不够灵活。 有时你需要(或想要)具有对同一个对象的多个引用并且对其进行变异的能力。 input单元格

CellRefCell的想法是在受到混淆的情况下以受控方式允许可变性:

  • Cell防止形成其内部的参考,避免悬挂参考,
  • RefCell混叠XOR可变性的实施从编译时间转移到运行时间。

这个function有时被描述为提供内部可变性 ,也就是说,从外部( &T )看起来不可变的对象实际上可以被突变。

当这个可变性扩展到多个线程时,您将使用MutexRwLockAtomicXXX ; 他们提供相同的function:

  • AtomicXXX只是Cell :没有参考的内部,只是进出/
  • RwLock只是RefCell :通过卫兵可以获得内部的引用,
  • MutexRwLock的简化版本,它不区分只读保护和写保护; 所以在概念上类似于仅具有borrow_mut方法的borrow_mut

如果你来自C ++的背景:

  • Boxunique_ptr
  • Arcshared_ptr
  • Rcshared_ptr的非线程安全版本。

单元提供了类似于mutablefunction,除了额外的保证来避免别名问题。 把Cell看作是std::atomicRefCellstd::shared_mutex的非线程安全版本(如果发生locking,则抛出而不是阻塞)。