e-tipsmemo

ごった煮

Rust multithread 確認

e-tipsmemo.hatenablog.com
このような記事を書いたが、そもそもthreadをたくさんjoinした後に、
その後の処理はそれらスレッドの終了を待っているのだろうか。と思ったので確認してみた。

#[cfg(test)]
mod tests {
    use super::*;

    fn hoge(thread: u32, num: u32) -> u32 {
        for x in 0..num {
            println!("th:{}, count:{}", thread, x);
            thread::sleep(std::time::Duration::from_millis(1000));
        }
        thread
    }

    #[test]
    fn thread_barrer() {
        let v = vec![20, 30, 10, 15, 17];
        let mut children = vec![];
        for t in 0..v.len() {
            let num = v[t as usize];
            children.push(thread::spawn(move || hoge(t as u32, num)));
        }

        let mut ret = vec![];

        for child in children {
            ret.push(child.join().unwrap());
        }

        println!("{:?}", ret.iter().fold(0, |s, &t| s + t));
    }
}

結果としてこのプログラムは全てのchild threadがおわってから次の処理を行うという意図したものになってた。

$ cargo test
   Compiling multi v0.1.0 (*** )
    Finished dev [unoptimized + debuginfo] target(s) in 1.3 secs
     Running target/debug/deps/multi-1bf733f9a047a566

running 1 test
th:2, count:0
(略)
th:2, count:3
th:1, count:3
th:3, count:3
th:0, count:3
th:4, count:3
th:1, count:4
th:4, count:4
th:2, count:4
th:3, count:4
th:0, count:4
th:0, count:5
th:3, count:5
th:4, count:5
th:2, count:5
th:1, count:5
(略)
th:0, count:12
th:1, count:12
th:3, count:12
th:4, count:12
th:0, count:13
th:4, count:13
th:3, count:13
th:1, count:13
th:0, count:14
(略)
th:1, count:20
th:1, count:21
th:1, count:22
th:1, count:23
th:1, count:24
th:1, count:25
th:1, count:26
th:1, count:27
th:1, count:28
th:1, count:29
10
.
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured

Correct way to wait until all threads are finished
結論:勝手に待ってくれている。

並行コンピューティング技法 ―実践マルチコア/マルチスレッドプログラミング

並行コンピューティング技法 ―実践マルチコア/マルチスレッドプログラミング

Mastering Rust: Advanced concurrency, macros, and safe database

Mastering Rust: Advanced concurrency, macros, and safe database