Nice programing

Rust의 셀 및 참조 횟수 유형에 대한 전체적인 설명이 필요합니다.

nicepro 2020. 11. 17. 21:04
반응형

Rust의 셀 및 참조 횟수 유형에 대한 전체적인 설명이 필요합니다.


Rust 표준 라이브러리에는 몇 가지 래퍼 유형이 있습니다.

내가 이해하는 바와 같이 이들은 단순한 참조보다 더 많은 가능성을 제공하는 래퍼입니다. 몇 가지 기본 사항을 이해하지만 전체 그림을 볼 수는 없습니다.

정확히 무엇을합니까? 셀 및 참조 카운트 패밀리가 직교 또는 유사한 기능을 제공합니까?


Rust에는 두 가지 필수 개념이 있습니다.

  • 소유권,
  • 가변성.

다양한 포인터 유형 ( Box, Rc, Arc)에 관심을 소유권 : 그들은 하나의 객체에 대한 단일 또는 복수 소유자가 있는지 여부를 제어 할 수 있습니다.

한편, 다양한 세포 ( Cell, RefCell, Mutex, RwLock, AtomicXXX)에 관련되는 가변성 .


Rust 안전의 기본 규칙은 Aliasing XOR Mutability 입니다. 즉, 객체는 내부에 대한 뛰어난 참조가없는 경우에만 안전하게 변경 될 수 있습니다.

이 규칙은 일반적으로 차용 검사기에 의해 컴파일 타임에 적용됩니다 .

  • 가있는 경우 범위에서 동일한 개체에 대한를 &T가질 수 없습니다 &mut T.
  • 가있는 경우 &mut T범위에서 동일한 객체에 대한 참조도 가질 수 없습니다.

그러나 때로는 이것은 충분히 유연하지 않습니다. 때로는 동일한 객체에 대한 여러 참조를 가지면서도 변경하는 기능이 필요하거나 필요합니다. 셀을 입력합니다 .

Celland 의 개념은 제어 된 방식으로RefCell 앨리어싱이 있는 경우 변경 가능성을 허용 하는 것입니다 .

  • Cell 내부에 대한 참조 형성을 방지하고 매달린 참조를 방지합니다.
  • RefCell컴파일 타임에서 런타임 으로 Aliasing XOR Mutability 의 적용을 이동합니다 .

이 기능은 때때로 내부 변경 가능성 을 제공하는 것으로 설명되며 , 그렇지 않으면 외부 ( &T) 에서 변경할 수없는 객체 가 실제로 변경 될 수 있습니다.

이 가변성이 여러 스레드에 걸쳐 확장되면 대신 Mutex, RwLock또는 AtomicXXX; 동일한 기능을 제공합니다.

  • AtomicXXX단지 Cell: 내부에 대한 언급이없고, 단지 들어오고 나가는 것,
  • RwLock단지 RefCell: 경비원을 통해 내부에 대한 참조를 얻을 수 있습니다 .
  • MutexRwLock읽기 전용 가드와 쓰기 가드를 구분하지 않는 단순화 된 버전입니다 . 개념적으로 RefCellborrow_mut메소드 만있는 a 유사합니다 .

C ++ 배경에서 온 경우 :

  • Box입니다 unique_ptr.
  • Arc입니다 shared_ptr.
  • Rc의 스레드로부터 안전하지 않은 버전입니다 shared_ptr.

셀은 mutable앨리어싱 문제를 방지하기위한 추가 보장을 제외하고와 유사한 기능을 제공 합니다. 생각 Cell같은 std::atomicRefCell의 비 스레드 안전 버전으로 std::shared_mutex(잠금이 가지고가는 경우에 대신 차단의 발생).


Matthieu의 좋은 답변 덕분에 다음은 사람들이 필요한 래퍼를 찾는 데 도움이되는 다이어그램입니다.

+-----------+
| Ownership |
+--+--------+                              +================+
   |                         +-Static----->| T              |(1)
   |                         |             +================+
   |                         |
   |                         |             +================+
   |          +-----------+  | Local    Val| Cell<T>        |(1)
   +-Unique-->| Borrowing +--+-Dynamic---->|----------------|
   |          +-----------+  |          Ref| RefCell<T>     |(1)
   |                         |             +================+
   |                         |
   |                         |             +================+
   |                         | Threaded    | AtomicT        |(2)
   |                         +-Dynamic---->|----------------|
   |                                       | Mutex<T>       |(1)
   |                                       | RwLock<T>      |(1)
   |                                       +================+
   |
   |
   |                                       +================+
   |                         +-No--------->| Rc<T>          |
   |                         |             +================+
   | Locally  +-----------+  |
   +-Shared-->| Mutable?  +--+             +================+
   |          +-----------+  |          Val| Rc<Cell<T>>    |
   |                         +-Yes-------->|----------------|
   |                                    Ref| Rc<RefCell<T>> |
   |                                       +================+
   |
   |
   |                                       +================+
   |                         +-No--------->| Arc<T>         |
   |                         |             +================+
   | Shared   +-----------+  |
   +-Between->| Mutable?  +--+             +================+
     Threads  +-----------+  |             | Arc<AtomicT>   |(2)
                             +-Yes-------->|----------------|
                                           | Arc<Mutex<T>>  |
                                           | Arc<RwLock<T>> |
                                           +================+
  1. 이 경우 다음 T으로 대체 할 수 있습니다.Box<T>
  2. a 또는 숫자 일 AtomicT사용Tbool

Mutex또는 을 사용해야하는지 알아 RwLock보려면 이 관련 질문을 참조하십시오 .

참고URL : https://stackoverflow.com/questions/45674479/need-holistic-explanation-about-rusts-cell-and-reference-counted-types

반응형