DEV Community

あかやん
あかやん

Posted on

Rustのシンプルなスレッドの実装

一番簡単なスレッドの実装

thread::spawn(function)で実装可能。
functionには任意の関数を入れることができる。Rustでクロージャを作成するときは以下

|x, y| {}
Enter fullscreen mode Exit fullscreen mode

{}の中には複数行を書くことが可能で、関数の戻り値の行のみ;無しで実装する必要がある


|x, y| {
  let value = x + y;
  value
}
Enter fullscreen mode Exit fullscreen mode

これを踏まえてシンプルなスレッドを実装すると以下の通り。

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スレッドの処理が終わるまで待つ
    }
}
Enter fullscreen mode Exit fullscreen mode

ここで注意すべきはクロージャの前に move が書かれていること。
Rustには所有権の概念があり、それに関連したエラーです。
単にループを回してスレッドを作成するだけだと、xの所有権がthread内に移されず、スレッドが完了する前にxが寿命となる可能性があるためエラーを吐き出している。

そのため、xの所有権を各スレッドに移すためにmoveを使用している。

このようにRustでは常に所有権を意識して実装を進めなければならない。

Top comments (0)