一番簡単なスレッドの実装
thread::spawn(function)で実装可能。
functionには任意の関数を入れることができる。Rustでクロージャを作成するときは以下
|x, y| {}
{}の中には複数行を書くことが可能で、関数の戻り値の行のみ;無しで実装する必要がある
例
|x, y| {
  let value = x + y;
  value
}
これを踏まえてシンプルなスレッドを実装すると以下の通り。
main() {
    let mut handles = Vec::new();
    for x in 1..10 {
        handles.push(thread::spawn(move || {
            println!("{}", x)
        }));
    }
    for handle in handles {
        handle.join();  // 10スレッドの処理が終わるまで待つ
    }
}
ここで注意すべきはクロージャの前に move が書かれていること。
Rustには所有権の概念があり、それに関連したエラーです。
単にループを回してスレッドを作成するだけだと、xの所有権がthread内に移されず、スレッドが完了する前にxが寿命となる可能性があるためエラーを吐き出している。
そのため、xの所有権を各スレッドに移すためにmoveを使用している。
このようにRustでは常に所有権を意識して実装を進めなければならない。
    
Top comments (0)