一番簡単なスレッドの実装
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)