Arc<T>
Atomic Reference Counting
定義
rspub struct Arc<T, A = Global>
where
A: Allocator,
T: ?Sized,
{ /* private fields */ }
Arc::newで値を生成すると、以下がヒープに確保される
Arc 内部で保持する値
その参照カウント
参照カウント
Arcをcloneすると1増える
そのArcのlifetimeが終了すると1減る
参照カウントが0になった場合に、ヒープに確保した領域を開放する
rustuse std::sync::Arc;
let a = Arc::new(vec![1, 2, 3]); // 参照カウント: 1
let b = a.clone(); // 参照カウント: 2
let c = a.clone(); // 参照カウント: 3
Arcの clone
は、一般的な clone
と異なり、
値のコピーはされず、参照カウントが増えるだけ
同じ名前で良いの?紛らわしくない?

Arcは複数のスレッド間でデータ共有できる
スレッド間通信できる
Rcは1スレッド内でのみデータ共有できる
スレッドセーフとは、複数のスレッドが同時にアクセスしても問題がない状態を指します。

なるほど

Arcのcloneの方がRcよりオーバーヘッドが大きい
1. Arc
とは?
異なるスレッド間で使用できるように、アトミック操作によって参照カウントが増減する。
スレッド間でデータを共有する必要がある場合に使う。
2. 使い方
rustuse std::sync::Arc;
use std::thread;
fn main() {
let data = Arc::new(vec![1, 2, 3]);
let handles: Vec<_> = (0..3).map(|_| {
let data = Arc::clone(&data);
thread::spawn(move || {
println!("{:?}", data);
})
}).collect();
for handle in handles {
handle.join().unwrap();
}
}
ポイント:
1. Arc::new(vec![1, 2, 3])
で Arc<T>
を作成
2. Arc::clone(&data)
を使って クローンを作成(参照カウントが増加)
3. thread::spawn
で複数スレッドに安全に渡せる