Arc

名前は、Atomically Reference Counted (原子参照カウント)の略。

Arc<T>Rc<T>のマルチスレッドでも使える版です。型Atomicを操作する為R<T>よりもオーバーヘッドが高いです。またTTrait std::marker::SendTrait std::marker::Sync を持っている必要があります。

use std::sync::Arc;
use std::thread;

let thirty_three: Arc<Vec<i32>> = Arc::new(vec![1, 2, 3]);

for _ in 0..3 {
  let ref_thirty_three = thirty_three.clone();
  let handler = thread::spawn(move || {
    let repeated = ref_thirty_three.repeat(2);

    assert_eq!(repeated, vec![1, 2, 3, 1, 2, 3]);
  });

  handler.join().unwrap();
}