自作コンパイラの部屋 > 用語集 > スレッド

スレッド

 スレッド(Thread)とは、一つのプログラム内でマルチタスクを行うための仕掛けである。
 スレッドという概念を簡潔に説明するのは難しい。試みに、手元の用語辞典を見てみると、以下のような記述がある。

 こんな説明で分る人はほとんどいないだろう。だいたい、この説明を書いた人はスレッドを理解してるのだろうか?そこで、以下、少し具体的に説明しよう。
 スレッドにもっとも近いのはサブルーチンである。サブルーチンを呼び出すと、以下のように、サブルーチンの処理が終了するまで呼び出し元は待たされた状態になる。

    呼び出し元        subA(サブルーチン)
      |
      ↓
    call sub-A --→ START
                |
                |
                ↓
      +------ RETURN
      |
      ↓

 一方、スレッドを呼び出すと、スレッドと元のプログラムが並行実行する。

    呼び出し元    thread-A(スレッド)
      ↓ 
thread-call thread-A --→ START 
      |          | 
      |   並行実行   | 
      ↓          ↓ 

 上記のように、スレッドを呼び出しても、呼び出し元の処理は継続する。そして、スレッドの実行も行われることから、並行処理が始まる。スレッドの呼び出しを複数回行うこともでき、そうすると3つ以上のスレッドを同時に起動することもできる。呼び出し元もスレッドの一種と考えられ、複数のスレッドが動くプログラムをマルチスレッドのプログラムという。
 スレッドは、上記の違い以外はサブルーチンとよく似ている。例えば、サブルーチンからはグローバル変数が参照できるが、スレッドからも同様である。各スレッドからはグローバル変数は「共有資源」として参照・更新できる。
 適切な言語やOS(例えばJava)を使えば、スレッドは非常に容易に利用できる。並行処理に慣れると、逐次的に見える問題でも、問題によっては並行処理で解いた方が簡単な場合がある(例:コンウェイの問題)。筆者が読んだJava入門という本には、以下のような記述がある。

別のスレッドで実行させ「ても」いいと思う動作があれば、それは別のスレッドで動作させる「べき」だ、というのがよい指針だと思います。Javaでのスレッド生成・実行・廃棄は比較的軽い操作ですから、必要なら遠慮なく使ってください。

 スレッドの問題は、むしろその手軽さかもしれない。各スレッドは簡単に(特別な宣言なしに)共有資源であるグローバル変数にアクセスできる。このため、資源競合の問題(クリティカル・セクション)が起きる原因になりやすい。
 今後は、スレッド対応のOSや言語の普及に伴い、プログラマがスレッドに慣れ、スレッドに対して安全(スレッドセーフあるいはリエントラントという)なコードを書けるようになる(それも、意識しないでも書けることが望ましい)ことが肝要であろう。

 スレッドを使うのは簡単になったが、では、マルチスレッドを実現するにはどうすればよいか、興味のある人は考えてみるとよい。

目次