RCIE-ジャンクのコード屋

主に自分のためにコーディングのTIPSを蓄積しています。

Rust スレッドの生成と合流 spawn, join

概要

  • 複数の処理を並行して実行するにはスレッドを生成する。
  • スレッドを生成するには「spawn」を使う。
  • スレッドの終了を待つには「join」を使う。
  • 処理をある時間だけ停止させるには「sleep」を使う。
プログラム例
  • 別スレッドで0.5秒間隔で5回「▲」と表示する。
  • 本スレッドで0.3秒間隔で5回「○」と表示する。
use std::thread::{spawn, sleep};
use std::time::{Duration};

fn main() {
    let 別スレッド = spawn(|| {
        for i in 1..=5 {
            sleep(Duration::from_millis(500));
            println!("▲ {:.1}", (i as f64) * 0.5);
        }
    });
    for i in 1..=5 {
        sleep(Duration::from_millis(300));
        println!("○ {:.1}", (i as f64) * 0.3);
    }
    別スレッド.join().unwrap();
}
結果
  • 1.5のところは、ほぼ同時に実行されているので、前後することがある。
○ 0.3
▲ 0.5
○ 0.6
○ 0.9
▲ 1.0
○ 1.2
▲ 1.5
○ 1.5
▲ 2.0
▲ 2.5
解説
use std::thread::{spawn, sleep};
use std::time::{Duration};

fn main() {
    let 別スレッド = spawn(|| {
    // └ 以下のような処理のスレッドを生成し実行する。
        for i in 1..=5 {
            sleep(Duration::from_millis(500));
            // └ 500ミリ秒、停止する。
            println!("▲ {:.1}", (i as f64) * 0.5);
            // └ {:.1} ◁小数点以下1桁表示する。
            // └ i as f64 ◁整数を実数に変換する。実数同士は計算できる。
        }
    });
    for i in 1..=5 {
        sleep(Duration::from_millis(300));
        println!("○ {:.1}", (i as f64) * 0.3);
    }
    別スレッド.join().unwrap();
    // └ 別スレッドが終了するまで待機する。
}