Rust의 셀 및 참조 횟수 유형에 대한 전체적인 설명이 필요합니다.
Rust 표준 라이브러리에는 몇 가지 래퍼 유형이 있습니다.
std::cell
모듈 의 셀 :Cell
및RefCell
- 참조 횟수가 계산 된 래퍼 (예 :
Rc
및Arc
. std::sync
모듈 의 유형 :Mutex
또는AtomicBool
예 :
내가 이해하는 바와 같이 이들은 단순한 참조보다 더 많은 가능성을 제공하는 래퍼입니다. 몇 가지 기본 사항을 이해하지만 전체 그림을 볼 수는 없습니다.
정확히 무엇을합니까? 셀 및 참조 카운트 패밀리가 직교 또는 유사한 기능을 제공합니까?
Rust에는 두 가지 필수 개념이 있습니다.
- 소유권,
- 가변성.
다양한 포인터 유형 ( Box
, Rc
, Arc
)에 관심을 소유권 : 그들은 하나의 객체에 대한 단일 또는 복수 소유자가 있는지 여부를 제어 할 수 있습니다.
한편, 다양한 세포 ( Cell
, RefCell
, Mutex
, RwLock
, AtomicXXX
)에 관련되는 가변성 .
Rust 안전의 기본 규칙은 Aliasing XOR Mutability 입니다. 즉, 객체는 내부에 대한 뛰어난 참조가없는 경우에만 안전하게 변경 될 수 있습니다.
이 규칙은 일반적으로 차용 검사기에 의해 컴파일 타임에 적용됩니다 .
- 가있는 경우 범위에서 동일한 개체에 대한를
&T
가질 수 없습니다&mut T
. - 가있는 경우
&mut T
범위에서 동일한 객체에 대한 참조도 가질 수 없습니다.
그러나 때로는 이것은 충분히 유연하지 않습니다. 때로는 동일한 객체에 대한 여러 참조를 가지면서도 변경하는 기능이 필요하거나 필요합니다. 셀을 입력합니다 .
Cell
and 의 개념은 제어 된 방식으로RefCell
앨리어싱이 있는 경우 변경 가능성을 허용 하는 것입니다 .
Cell
내부에 대한 참조 형성을 방지하고 매달린 참조를 방지합니다.RefCell
컴파일 타임에서 런타임 으로 Aliasing XOR Mutability 의 적용을 이동합니다 .
이 기능은 때때로 내부 변경 가능성 을 제공하는 것으로 설명되며 , 그렇지 않으면 외부 ( &T
) 에서 변경할 수없는 객체 가 실제로 변경 될 수 있습니다.
이 가변성이 여러 스레드에 걸쳐 확장되면 대신 Mutex
, RwLock
또는 AtomicXXX
; 동일한 기능을 제공합니다.
AtomicXXX
단지Cell
: 내부에 대한 언급이없고, 단지 들어오고 나가는 것,RwLock
단지RefCell
: 경비원을 통해 내부에 대한 참조를 얻을 수 있습니다 .Mutex
RwLock
읽기 전용 가드와 쓰기 가드를 구분하지 않는 단순화 된 버전입니다 . 개념적으로RefCell
는borrow_mut
메소드 만있는 a 와 유사합니다 .
C ++ 배경에서 온 경우 :
Box
입니다unique_ptr
.Arc
입니다shared_ptr
.Rc
의 스레드로부터 안전하지 않은 버전입니다shared_ptr
.
셀은 mutable
앨리어싱 문제를 방지하기위한 추가 보장을 제외하고와 유사한 기능을 제공 합니다. 생각 Cell
같은 std::atomic
과 RefCell
의 비 스레드 안전 버전으로 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>> |
+================+
- 이 경우 다음
T
으로 대체 할 수 있습니다.Box<T>
- a 또는 숫자 일
AtomicT
때 사용T
bool
Mutex
또는 을 사용해야하는지 알아 RwLock
보려면 이 관련 질문을 참조하십시오 .
'Nice programing' 카테고리의 다른 글
Tortoisesvn Subversion 1.8-병합-더 이상 분기 옵션을 다시 통합하지 않음 (0) | 2020.11.17 |
---|---|
Gulp 파일이 변경 될 때마다 Gulp를 어떻게 다시 시작할 수 있습니까? (0) | 2020.11.17 |
PHP 사이트에서 xss 공격을 방지하기위한 모범 사례는 무엇입니까? (0) | 2020.11.17 |
중첩 및 다중 (0) | 2020.11.17 |
내 프로그램이 C ++에서 파일 수정을 감시하게하려면 어떻게해야합니까? (0) | 2020.11.17 |