C.W.K.
Stream
Lesson 05 of 05 · published

Arc — 스레드 안전 공유

~11 min · smart-pointers, arc, send-sync, concurrency

Level 0Rust 호기심러
0 XP0/80 lessons0/19 achievements
0/100 XP to next level100 XP to go0% complete

RcRefCell 은 단일 스레드 안에서 작동해. 스레드 경계를 넘는 순간, 스레드 안전 짝이 필요해: ArcMutex. 이 레슨은 Arc 를 소개하고 Concurrency 트랙으로 다리를 놔.

Arc: 원자적 참조 카운팅

Arc<T>원자적 카운트를 가진 Rc<T> 야 — 여러 스레드에서 동시에 clone 하고 drop 해도 안전. 'A' 는 atomic: 카운트를 올리고 내리는 게 원자적 CPU 연산을 써서, 두 스레드가 망칠 수 없어. API 는 Rc 랑 동일; 스레드 안전성 (그리고 아주 작은 성능 비용) 만 달라.

왜 항상 Arc 안 쓰냐?

원자적 연산은 평범한 증가보다 조금 더 비싸. Rc 는 그걸 낼 필요 없는 흔한 단일 스레드 경우를 위해 존재해. 그리고 컴파일러가 선택을 강제해: RcSend 가 아니라서 (스레드 못 넘음), Rc 를 스레드 간 공유하려 하면 컴파일 안 돼 — 그리고 에러가 Arc 로 안내해. 잘못 고를 수 없어.

단일 스레드엔 Rc/RefCell; 스레드 간엔 Arc/Mutex. 패턴이 평행이야: 공유-가변 단일 스레드엔 Rc<RefCell<T>>, 공유-가변 스레드 간엔 Arc<Mutex<T>>. 컴파일러가 단일 스레드 버전을 스레드 간에 못 쓰게 해 — Send 랑 Sync (다음 트랙) 가 강제해.

fearless concurrency 로의 다리

Arc 는 데이터 소유권을 spawn 된 스레드와 공유하는 법이야. 안전한 변형을 위한 Mutex 와 합치면, Arc<Mutex<T>> 가 동시성 Rust 의 공유 상태 주식이야. 다음 트랙이 그걸 구체화해 — 그리고 여기서도 컴파일러가 왜 '데이터 레이스 없음' 을 약속할 수 있는지 보여줘.

Code

Arc 로 읽기 전용 데이터를 스레드 간 공유·rust
use std::sync::Arc;
use std::thread;

fn main() {
    // Arc: 스레드 간 공유 가능 (원자적 refcount)
    let data = Arc::new(vec![1, 2, 3]);

    let mut handles = vec![];
    for id in 0..3 {
        let data = Arc::clone(&data); // 각 스레드가 자기 핸들을 얻음
        handles.push(thread::spawn(move || {
            println!("thread {id} sees {} items", data.len());
        }));
    }
    for h in handles {
        h.join().unwrap();
    }
}

External links

Exercise

읽기 전용 Arc<Vec<i32>> 를 spawn 된 세 스레드에 공유하고, 각각 다른 슬라이스의 합을 출력해. 그다음 ArcRc 로 바꿔보고 Send 에 관한 컴파일러 에러를 읽어. 컴파일러가 너를 뭐에서 보호하는 거야?
Hint
Rc 의 비원자적 카운트는 두 스레드가 동시에 올리면 망가질 수 있어 — 데이터 레이스. RcSend 가 아니라서 컴파일러가 스레드로 move 를 거부하고, 원자적 Arc 로 몰아. 버그가 권장 안 되는 게 아니라 불가능해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.