Win32並行処理プログラミング入門7
CloseHandle関数は、カーネルオブジェクトの操作が終わった事を、OSに知らせる関数です。この意味を知るには、OSがカーネルオブジェクトをどのように扱うのかを知らねばなりません。これから、OSがカーネルオブジェクトを扱う方法について、基本的な事柄を解説します。
カーネルオブジェクトは、プロセスではなくOSのカーネルが所有しています。ですから、プロセスが終了しても、カーネルオブジェクトがメモリ上から削除されるとは限りません。カーネルは、カーネルオブジェクトの使用数をカウントする事により、メモリ上から削除するタイミングを判断しています。
カーネルは、カーネルオブジェクトを生成する関数が実行されると、カーネルオブジェクトの使用数をインクリメントさせ、CloseHandle関数が呼ばれると、使用数をデクリメントしています。そして、使用数が0となり、どのプロセスも使用していないとカーネルが判断した時、カーネルオブジェクトはメモリ上から削除されます。
CloseHandle関数を呼び出すのを忘れた場合、オブジェクトリークするかどうかは状況によります。プロセスが終了した時、OSが全てのリソースを解放する事が保障されています。ですから、直ぐに終了した場合リークは発生しませんが、長期間ソフトウェアが動作しているとリークが発生する可能性があります。CloseHandle関数を絶対に呼び出しましょう。
CloseHandle関数を使用するにあたって、一つ注意するべき事があります。それは、CloseHandle関数のパラメータとして使用した、カーネルオブジェクトのハンドルを格納する変数は、後で必ずNULLにセットしなくてはならない事です。NULLにする事を忘れると、ソフトウェアの状態が破壊される可能性があります。十分に注意して下さい。続く...