← λͺ©λ‘μœΌλ‘œ
Understanding Concurrency Types in Rust

μ‹±κΈ€μŠ€λ ˆλ“œ ν™˜κ²½

μ‹±κΈ€μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œλŠ” Rc<T>와 RefCell<T>의 쑰합이 주둜 μ‚¬μš©λ©λ‹ˆλ‹€.
RcλŠ” 닀쀑 μ†Œμœ κΆŒ(μ°Έμ‘° μΉ΄μš΄νŒ…), RefCell은 λŸ°νƒ€μž„μ— κ°€λ³€ 접근을 μ œκ³΅ν•©λ‹ˆλ‹€.

use std::rc::Rc;
use std::cell::RefCell;

fn main() {
    let data = Rc::new(RefCell::new(vec![1, 2, 3]));
    let data_clone = Rc::clone(&data);

    data.borrow_mut().push(4);
    data_clone.borrow_mut().push(5);
    println!("데이터: {:?}", data.borrow());
}

μˆœν™˜ μ°Έμ‘°κ°€ λ°œμƒν•  수 μžˆλŠ” κ΅¬μ‘°μ—μ„œλŠ” Weak<T>λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

use std::rc::{Rc, Weak};
use std::cell::RefCell;

struct Node {
    next: Option<Rc<RefCell<Node>>>,
    prev: Option<Weak<RefCell<Node>>>,
    value: i32,
}

impl Node {
    fn new(value: i32) -> Rc<RefCell<Self>> {
        Rc::new(RefCell::new(Node {
            next: None,
            prev: None,
            value,
        }))
    }
}

fn main() {
    let first = Node::new(1);
    let second = Node::new(2);

    {
        let mut first_ref = first.borrow_mut();
        let mut second_ref = second.borrow_mut();

        first_ref.next = Some(Rc::clone(&second));
        second_ref.prev = Some(Rc::downgrade(&first));
    }
}

λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½

λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œλŠ” Arc<T>와 Mutex<T>의 쑰합이 ν•„μš”ν•©λ‹ˆλ‹€.
ArcλŠ” μ›μžμ  μ°Έμ‘° μΉ΄μš΄νŒ…μœΌλ‘œ μŠ€λ ˆλ“œ μ•ˆμ „ν•œ 닀쀑 μ†Œμœ κΆŒμ„, MutexλŠ” 락 기반의 κ°€λ³€ 접근을 μ œκ³΅ν•©λ‹ˆλ‹€.

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

fn main() {
    let data = Arc::new(Mutex::new(vec![1, 2, 3]));
    let mut handles = vec![];

    for i in 0..3 {
        let data_clone = Arc::clone(&data);
        let handle = thread::spawn(move || {
            thread::sleep(Duration::from_millis(10 * i as u64));
            let mut data = data_clone.lock().unwrap();
            data.push(i + 4);
            println!("μŠ€λ ˆλ“œ {}: {:?}", i, *data);
        });
        handles.push(handle);
    }

    for handle in handles {
        handle.join().unwrap();
    }

    println!("μ΅œμ’… 데이터: {:?}", *data.lock().unwrap());
}

Mutex 락은 κ°€λŠ₯ν•œ 짧게 μœ μ§€ν•˜κ³ , λ°λ“œλ½μ„ ν”Όν•˜κΈ° μœ„ν•΄ 락 νšλ“ μˆœμ„œλ₯Ό μΌκ΄€λ˜κ²Œ μœ μ§€ν•΄μ•Ό ν•©λ‹ˆλ‹€.