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歳です