use std::sync::RwLock の Read, Write
https://doc.rust-lang.org/stable/std/sync/struct.RwLock.html
概念は結構複雑なんだけど、なんかすげ〜簡単に書いてるな…
use std::sync::{Arc, RwLock};
use std::thread;
struct User {
name: String,
age: u32,
}
fn main() {
let user = Arc::new(RwLock::new(User {
name: String::from("Alice"),
age: 30,
}));
let mut handles = vec![];
for i in 0..10 {
let data_clone = Arc::clone(&user);
let handle = thread::spawn(move || {
let shared = data_clone.read().unwrap();
println!("読み取りスレッド {}: {}は{}です", i, shared.name, shared.age);
});
handles.push(handle);
}
for i in 0..5 {
let data_clone = Arc::clone(&user);
let handle = thread::spawn(move|| {
let mut shared = data_clone.write().unwrap();
shared.age += 1;
shared.name = format!("Alice({})", i);
println!("書き込みスレッド {}: カウンターを更新しました", i);
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
let final_state = user.read().unwrap();
println!("最終状態: {} は{}歳です", final_state.name, final_state.age);
}
Compiling parallel v0.1.0 (/home/vagrant/dev/rust/parallel)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.37s
Running `target/debug/parallel`
読み取りスレッド 0: Aliceは30です
読み取りスレッド 4: Aliceは30です
読み取りスレッド 2: Aliceは30です
読み取りスレッド 5: Aliceは30です
書き込みスレッド 3: カウンターを更新しました
書き込みスレッド 4: カウンターを更新しました
書き込みスレッド 2: カウンターを更新しました
書き込みスレッド 1: カウンターを更新しました
書き込みスレッド 0: カウンターを更新しました
読み取りスレッド 1: Alice(0)は35です
読み取りスレッド 8: Alice(0)は35です
読み取りスレッド 9: Alice(0)は35です
読み取りスレッド 3: Alice(0)は35です
読み取りスレッド 7: Alice(0)は35です
読み取りスレッド 6: Alice(0)は35です
最終状態: Alice(0) は35歳です