Last Updated 2002/10/04 |
Programming Tips Windows | 索 引 |
セマフォ
2002/10/04
CreateSemapore() をの戻り値のハンドルは CloseHandle() しなければならない. カーネルオブジェクトのハンドルはシステム内部の固定的な領域から割り当てられる.(以外と早く枯渇する) 理論的には 64K 個のハンドルが割り当て可能だが,32M 程度のメモリだと 2000 個程度しか確保できない. ReleaseSemaphore() する前にプロセスが死んでしまうと,別のプロセスから同じセマフォオブジェクトを使用すると,CreateSemaphore() は成功するが,WaitForSingleObject() でウェイトがかかり, プロセスが停止する. 領域は開放されても,フラグは残ったままとなる.(これが MUTEX との違い) カーネルオブジェクトは複数のプロセスからオープンできるが,オブジェクトの実体はひとつ.そのオブジェクトには参照カウントがある.すべてのプロセスがクローズしてやっと参照カウントが 0 になり,オブジェクトが解放される. クローズは,プロセスにとって不要になってすぐ行ってよいが,セマフォはそれ自身が参照カウンターを持っているので Release しなければならない. MUTEX は所有権というもので,プロセスが死ねばすぐ解放される. 参照 |
|