use std::thread;
fn main() {
// 1〜1000 の合計を前半と後半で手分けする
let first = thread::spawn(|| (1..=500u64).sum::<u64>());
let second = thread::spawn(|| (501..=1000u64).sum::<u64>());
let a = first.join().unwrap();
let b = second.join().unwrap();
println!("前半 = {}, 後半 = {}", a, b);
println!("合計 = {}", a + b);
}
4JoinHandle を Vec で管理する
スレッドの本数が増えたら、JoinHandle を Vec にためて最後にまとめて join するのが定番の形です。join する順番はコード側で決まっているので、表示順は実行ごとに変わりません。素数数えのような CPU を使う処理は、こうして分担する効果が出やすい代表例です。
Rust
use std::thread;
fn is_prime(n: u32) -> bool {
n >= 2 && (2..n).take_while(|d| d * d <= n).all(|d| n % d != 0)
}
fn main() {
let mut handles = Vec::new();
handles.push(thread::spawn(|| (2..1700).filter(|&n| is_prime(n)).count()));
handles.push(thread::spawn(|| (1700..3400).filter(|&n| is_prime(n)).count()));
handles.push(thread::spawn(|| (3400..5000).filter(|&n| is_prime(n)).count()));
let mut total = 0;
for (i, handle) in handles.into_iter().enumerate() {
let count = handle.join().unwrap();
println!("担当{}: 素数 {} 個", i + 1, count);
total += count;
}
println!("5000未満の素数は合計 {} 個", total);
}