Rc = reference counted, single-threaded, non-atomic. Arc = atomic reference counted, multi-threaded, atomic. Same shared-ownership concept, different thread-safety.
Rc — fast, single-thread:
1use std::rc::Rc;23let shared = Rc::new(vec!["task1", "task2"]);4let worker1 = Rc::clone(&shared);5let worker2 = Rc::clone(&shared);67println!("Worker1: {:?}", *worker1);8println!("Worker2: {:?}", *worker2);9println!("Count: {}", Rc::strong_count(&shared)); // 3
Arc — safe, multi-threaded:
1use std::sync::Arc;2use std::thread;34let tasks = Arc::new(vec!["task1", "task2", "task3"]);5let mut handles = vec![];67for i in 0..3 {8 let t = Arc::clone(&tasks);9 handles.push(thread::spawn(move || {10 for task in t.iter() {11 println!("Thread {}: {}", i, task);12 }13 }));14}15for h in handles { h.join().unwrap(); }
When to use Rc:
When to use Arc:
Common mistakes: