マルチスレッド
読み:マルチスレッド
外語:multi thread
プログラムが、スレッドと呼ばれる処理単位を一つ以上生成し、これがあたかも同時に動いているかのように見える機構のこと。またこのような機能を有するオペレーティングシステム(OS)をマルチスレッドオペレーティングシステムという。
概要
マルチタスクの場合、一つのプロセスをタスクと呼び、これを一単位として切り替えていた。
一方マルチスレッドの場合では、プロセスは更に細かい単位に区切られ、これを一単位として切り替える。つまり、アプリケーションプログラム内でのマルチタスク処理が、マルチスレッドであるといえる。
すなわち、規模的には、スレッド≦(タスク≒プロセス)≦ジョブ、である。
特徴
プロセスとスレッド
プロセス(またはタスク、以下同)とスレッドは、その作り方に大きな違いがあり、これが処理速度に大きく関わることになる。
プロセスの場合、UNIXではfork(2)システムコール、Microsoft WindowsではCreateProcess()システムコールで生成する。forkは引数がないシンプルなシステムコールだが、自身の「複製」を作成するため、処理が重い。WindowsのCreateProcessは数多くの引数を要求し、結果としてEXEファイルを実行するため、明らかに処理が重い。
対してスレッドの場合、UNIXのPOSIXスレッドではpthread_create(3)関数を使う。引数は4個とforkより多いが、スレッド処理構造体を作って所定の関数を呼び出すだけの処理なので、forkのようにプロセス全体を複写する必要がなく、処理は大幅に高速となる。プログラマーも、スレッド関数を用意するだけで良いので、forkの時のように条件分岐など分かりにくい処理を書く手間がない。
技術
複数のスレッド間で一つのリソースを共有する場合、競合を避ける必要がある。使用中に他を排他するために、ミューテックスやセマフォが使われる。どちらを使うか、どちらも使うかは、そのオペレーティングシステム(OS)の実装による。
特定のスレッドローカルな変数(これをスレッドローカルストレージという)を使いたい場合は、言語の機能を使うか、またはOSが提供するAPIなどを使うことで実現する。OSは各スレッドを管理するための情報を持っており、これはスレッドローカルである。このなかに、数に限りはあるが任意の値を格納することが可能で、これを使うとスレッドローカルな変数となる。errnoなども、その一例である。
再検索