μ±κΈμ€λ λ νκ²½μμλ 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 λ½μ κ°λ₯ν μ§§κ² μ μ§νκ³ , λ°λλ½μ νΌνκΈ° μν΄ λ½ νλ μμλ₯Ό μΌκ΄λκ² μ μ§ν΄μΌ ν©λλ€.