예제

ArcMutex의 동작을 살펴봅시다:

use std::thread;
// std::sync::{Arc, Mutex}; 사용

fn main() {
    let v = vec![10, 20, 30];
    let handle = thread::spawn(|| {
        v.push(10);
    });
    v.push(1000);

    handle.join().unwrap();
    println!("v: {v:?}");
}

가능한 해결책:

use std::sync::{Arc, Mutex};
use std::thread;

fn main() {
    let v = Arc::new(Mutex::new(vec![10, 20, 30]));

    let v2 = Arc::clone(&v);
    let handle = thread::spawn(move || {
        let mut v2 = v2.lock().unwrap();
        v2.push(10);
    });

    {
        let mut v = v.lock().unwrap();
        v.push(1000);
    }

    handle.join().unwrap();

    println!("v: {v:?}");
}

눈여겨 볼 부분:

  • vArcMutex 모두에 포함되어 있습니다. 이는 ArcMutex가 서로 완전히 다른 문제를 위한 도구이기 때문입니다.
    • MutexArc로 래핑하는 것은 가변 상태를 스레드들 간에 공유할 때 흔히 사용하는 패턴입니다.
  • v: Arc<_>를 다른 스레드에서 사용하려면, 먼저 v2로 복사를 하고 이를 그 스레드로 이동 해야 합니다. 그래서 람다의 시그니처에 move가 있는 것입니다.
  • 블록은 LockGuard의 범위를 최대한 좁히기 위해 사용되었습니다.