概要
一つの
プロセスがスレッドと呼ばれる処理を複数生成し、並行して複数の処理を行なうこと。実際には、CPUの処理時間を非常に短い単位に分割し、複数のスレッドに順番に割り当てることにより、複数の処理を同時に行っているようにみせかけている。
使用ケース
- GUIアプリにおいて、時間がかかる処理がある
- 複数の要求を待つ処理がある
- 同時に実行したい複数の処理がある
メリット
- 複数のスレッドが同じメモリ空間を使用できる
- マルチプロセスに比べ、タスクスイッチのオーバーヘッドが少ない
メインスレッド
プロセスに最低一つの存在するスレッド。すなわち、main関数やWinMain関数を実行すると、メインスレッドが生成される。また、これ以外にメインスレッドを作る方法というのは特に存在しない。
スレッド生成, 終了関数
CreateThread(), ExitThread()
C/C++のライブラリ関数を使用する場合、ライブラリ関数用に確保したリソースがメモリリークする可能性があるので、基本的にC/C++では使用するべきではない。以下、MSDN抜粋。
C のランタイムライブラリに記録されている関数を使うスレッドは、CreateThread 関数と ExitThread 関数ではなく、C のランタイム関数である beginthread 関数と endthread 関数を使うべきです。この方法に従わないと、ExitThread 関数を呼び出したときにわずかなメモリリークが発生します。
_beginthread(), _endthread()
_beginthreadex(), _endthreadex()
これらの関数でスレッドを開始した場合、スレッドプロシージャを抜けたときに自動的にこれらの終了関数が呼び出されるようになっているので,明示的に終了関数は呼び出す必要はない。また、基本的に後者を使用したほうがいい。以下、MSDN抜粋。
_beginthread よりも _beginthreadex を使用した方が安全です。_beginthread が作成したスレッドの終了が早すぎると、_beginthread の呼び出し元に返されるハンドルが無効となる可能性や、別のスレッドを指してしまう可能性があります。しかし、_beginthreadex から返されるハンドルは _beginthreadex の呼び出し元で閉じられる必要があるため、_beginthreadex がエラーを返さなかった場合にはハンドルが有効であることが保証されます。
AfxBeginThread(), AfxEndThread()
纏め
スレッド生成, 終了関数 |
C |
C++ |
VC++(MFC無) |
VC++(MFC有) |
備考 |
|
|
|
|
|
|
CreateThread(), ExitThread() |
× |
× |
× |
× |
メモリリークの可能性有り |
_beginthread(), _endthread() |
× |
× |
× |
× |
スレッドハンドルに関する問題有り |
_beginthreadex(), _endthreadex() |
◎ |
◎ |
◎ |
○ |
|
AfxBeginThread(), AfxEndThread() |
- |
- |
- |
◎ |
MFCのみ有効 |
その他のスレッド関連関数
GetExitCodeThread()
スレッドプロシージャの戻り値を取得する。
スレッドハンドルは,スレッド自体が終了したからといって直ちに無効になるわけではなく、CloseHandle()を呼び出してクローズするまでは有効である。そのため,スレッドが終了した後でスレッドハンドルを指定してGetExitCodeThread()を呼び出しても問題はない。
但し、_endthread()が内部でスレッドハンドルをクローズするので,スレッド終了後は_beginthread()の戻り値であるスレッドハンドルが無効になってしまう。特にスレッドプロシージャの処理が非常に短い場合は,_beginthread()から戻った時点で,既にスレッドが終了している可能性もあるので注意する。
コメント
最終更新:2009年04月20日 20:29