์˜ˆ์ œ

Arc์™€ Mutex์˜ ๋™์ž‘์„ ์‚ดํŽด๋ด…์‹œ๋‹ค:

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:?}");
}

๋ˆˆ์—ฌ๊ฒจ ๋ณผ ๋ถ€๋ถ„:

  • v๋Š” Arc์™€ Mutex ๋ชจ๋‘์— ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” Arc์™€ Mutex๊ฐ€ ์„œ๋กœ ์™„์ „ํžˆ ๋‹ค๋ฅธ ๋ฌธ์ œ๋ฅผ ์œ„ํ•œ ๋„๊ตฌ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
    • Mutex๋ฅผ Arc๋กœ ๋ž˜ํ•‘ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋ณ€ ์ƒํƒœ๋ฅผ ์Šค๋ ˆ๋“œ๋“ค ๊ฐ„์— ๊ณต์œ ํ•  ๋•Œ ํ”ํžˆ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค.
  • v: Arc<_>๋ฅผ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, ๋จผ์ € v2๋กœ ๋ณต์‚ฌ๋ฅผ ํ•˜๊ณ  ์ด๋ฅผ ๊ทธ ์Šค๋ ˆ๋“œ๋กœ ์ด๋™ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋žŒ๋‹ค์˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜์— move๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ๋ธ”๋ก์€ LockGuard์˜ ๋ฒ”์œ„๋ฅผ ์ตœ๋Œ€ํ•œ ์ขํžˆ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.