Skip to content

Instantly share code, notes, and snippets.

@motchang
Created June 20, 2020 07:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save motchang/dc7cc3ab1c8447cf0d769db9fe7c4744 to your computer and use it in GitHub Desktop.
Save motchang/dc7cc3ab1c8447cf0d769db9fe7c4744 to your computer and use it in GitHub Desktop.
3-6-1 E2077
use std::{time, thread};
fn main() {
let n1 = 1200;
let n2 = 1000;
// spawn で子スレッドを立ち上げ、子スレッドで重い処理を実行する
// 変数 child がスレッドへのハンドルに束縛される
// let child = thread::spawn(move || {
// // 重い処理を実行する
// heavy_calc("child", n2);
// });
// これなら動く
let child = thread::spawn(move || heavy_calc("child", n2));
// 親スレッドでも重い処理を実行する。子スレッドの処理と同時に実行される
let s1 = heavy_calc("main", n1);
// スレッドのハンドルに対して join を呼ぶことでスレッドの終了を待つ
// クロージャの戻り値はOkでラップされる。もしスレッドがエラーにより
// 異常終了したら Err が返る
match child.join() {
Ok(s2) => println!("{}, {}", s1, s2),
Err(e) => println!("err: {:?}", e)
}
}
fn heavy_calc(name: &str, n: u64) -> u64 {
println!("{}: started,", name);
// 重い処理の代用として nミリ秒スリープする
thread::sleep(time::Duration::from_millis(n));
// 1からnまでの数字を足し合わせる
let sum = (1..= n).sum();
println!("{}: ended.", name);
sum
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment