🦀
threadのspawnとscopeの違い
Rustのスレッド作成時のthread::spawn
とthread::scope
という2つの違いについて説明します。
thread::spawn
thread::spawn
は、新しいスレッドを作成し、そのスレッドで指定された処理を実行します。作成したスレッドは明示的に終了させる必要があります。
use std::thread;
fn main() {
let handler = thread::spawn(|| {
// 新しいスレッドで実行される処理
println!("Hello from a new thread!");
});
// 他の処理...
handler.join().unwrap(); // スレッドの終了を待つ
}
上記の例では、thread::spawn
を使って新しいスレッドを作成しています。spawn
の引数にはクロージャを渡し、そのクロージャ内の処理が新しいスレッドで実行されます。
作成したスレッドはhandler
という変数に格納されています。この変数に対してjoin
メソッドを呼び出すと、そのスレッドが終了するまで待機します。join
を呼び忘れると、プログラムが終了する前にスレッドが強制終了される可能性があります。
thread::spawn
は、スレッドをプログラム終了まで維持する必要がある場合に適しています。
thread::scope
一方、thread::scope
は一時的な短命のスレッドを作成するための機能です。scope
ブロックを抜けると、そのスコープ内で作成したすべてのスレッドが自動的に終了されます。
use std::thread;
fn main() {
thread::scope(|s| {
s.spawn(|| {
// 新しいスレッドで実行される処理
println!("Hello from a new thread!");
});
// 他の一時的なスレッドを作成する場合もこの中に記述
}); // スコープを抜けると、作成したスレッドが自動的に終了
// 他の処理...
}
上記の例では、thread::scope
の中でs.spawn
を使ってスレッドを作成しています。scope
ブロックを抜けると、そのスコープ内で作成したすべてのスレッドが自動的に終了されます。つまり、スレッドの終了処理を明示的に行う必要がありません。
thread::scope
を使うメリットは、一時的にスレッドを作成して使い捨てるような場合に、スレッドの作成と終了をスムーズに行えることです。また、スレッドの終了処理を自動化できるため、エラーが発生する可能性が低くなります。
まとめ
-
thread::spawn
で作成したスレッドは明示的にjoin()
で終了させる必要があります。 -
thread::scope
内で作成したスレッドは、スコープを抜けると自動的に終了します。 -
spawn
はスレッドをプログラム終了まで維持する必要がある場合に適しています。 -
scope
は一時的なスレッドを使い捨てたい場合に便利です。
Discussion