[Rust 공식문서 한국어 정리] 109. Rust Send 트레이트 가이드
[Rust 공식문서 한국어 정리] 109. Rust Send 트레이트 가이드
원문 제목: Trait std::marker::Send
작성자: The Rust Project
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📌 1. 서론 — 이 문서가 다루는 내용
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Send 트레이트가 제공하는 스레드 간 소유권 이동 안전성을 상세히 다룹니다.
값을 다른 스레드로 이동시킬 수 있는 조건과 컴파일러의 자동 추론을 학습합니다.
Send가 아닌 타입의 예시와 그 이유를 정리합니다.
Rc, RefCell 등이 Send가 아닌 이유와 대안을 설명합니다.
unsafe impl Send를 사용하여 커스텀 타입의 Send 구현을 제어하는 방법을 다룹니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔑 2. 핵심 개념 4가지
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
① Send — 값을 다른 스레드로 소유권 이동 가능
② !Send — 스레드 간 이동이 안전하지 않은 타입
③ 자동 추론 — 필드가 모두 Send이면 구조체도 Send
④ unsafe impl Send — 수동으로 Send 마커 구현
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📖 3. 주요 내용 상세
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Send 트레이트는 타입의 값을 다른 스레드로 소유권 이동이 안전함을 나타냅니다.
Send는 마커 트레이트로 메서드가 없고 컴파일러가 자동으로 추론합니다.
모든 필드가 Send인 구조체나 열거형은 자동으로 Send입니다.
Rc는 Send가 아닙니다.
Rc는 참조 카운트를 원자적으로 증감하지 않으므로 스레드 간 공유가 안전하지 않습니다.
대신 Arc는 원자적 참조 카운트를 사용하므로 Send입니다.
RefCell는 Send가 아닙니다.
RefCell의 내부 가변성은 런타임 빌림 규칙 검사를 하며 이는 스레드 안전하지 않습니다.
대신 Mutex나 RwLock를 사용하여 스레드 간 안전한 내부 가변성을 얻습니다.
원시 포인터 *const T와 *mut T는 Send가 아닙니다.
이는 원시 포인터가 가리키는 데이터의 스레드 안전성을 알 수 없기 때문입니다.
unsafe impl Send for MyType {}으로 수동으로 Send를 구현할 수 있습니다.
이 경우 개발자가 스레드 간 이동의 안전성을 보증해야 합니다.
Cell는 T가 Send이더라도 Cell 자체는 Send가 아닙니다.
Cell은 내부 가변성을 제공하며 복사 가능한 타입에만 사용됩니다.
스레드 간 이동이 필요한 데이터는 항상 Send인지 확인해야 합니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🛠 4. 실전 활용
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
스레드로 데이터를 전달할 때는 Send 경계를 만족하는 타입만 사용합니다.
Rc 대신 Arc를 사용하여 여러 스레드 간 소유권을 공유합니다.
unsafe impl Send로 내부 동기화를 보장하는 커스텀 타입을 스레드 이동 가능하게 합니다.
crossbeam이나 tokio의 채널을 통해 Send 데이터를 스레드 간 전달합니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ 5. 정리
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Send는 스레드 간 소유권 이동의 안전성을 보장하는 마커 트레이트입니다.
Rc, RefCell 등은 Send가 아니므로 대안 타입을 사용해야 합니다.
unsafe impl Send는 신중히 사용해야 하며 안전성은 개발자가 책임집니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔗 출처 링크
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
원문: https://doc.rust-lang.org/std/marker/trait.Send.html
Send and Sync: https://doc.rust-lang.org/nomicon/send-and-sync.html
#Rust #Send #스레드안전성 #동시성 #번역

오뉴노노 님의 최근 댓글
ㅋㅋㅋㅋㅋ 2019 01.14 잘 읽었습니다 2018 12.30 포인트가 없어서 아직 시작을 못하고있는데요! 글은 잘 읽었습니다! 포인트 쌓고 도전할거에요 2018 12.30