🦀

threadのspawnとscopeの違い

2024/04/21に公開

Rustのスレッド作成時のthread::spawnthread::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