6

なぜWaitForSingleObject(INVALID_HANDLE_VALUE、INFINITE)はなぜブロックされますか?

HANDLE mutexHandle = INVALID_HANDLE_VALUE; 
WaitForSingleObject(mutexHandle, INFINITE); 

ブロックしていますか?エラーメッセージとともに返されません。 INVALID_HANDLEのハンドルをチェックすると、ミューテックスハンドルにアクセスするためにミューテックスが必要になるので、ミューテックスは馬鹿になるでしょう...

BTW:ハンドルが閉じていればWAIT_FAILEDと返されます。

答えて

16

http://blogs.msdn.com/oldnewthing/archive/2004/03/02/82639.aspxから:

第四に、あなたはINVALID_HANDLE_VALUE値に特に注意する必要があります:偶然の一致では、値INVALID_HANDLE_VALUEGetCurrentProcess()で返される疑似ハンドルと同じ数値であることを起こります。多くのカーネル関数はpseudohandlesを受け入れます。もしあなたが混乱して、ハンドルにあるWaitForSingleObjectを誤って呼び出すと、あなたは実際に自分のプロセスを待つことになります。この待機は、もちろん完了することはありません。なぜなら、プロセスは終了時に通知されるため、あなたは自分自身を待つことになります。

+1

私は今気分が悪いと思う...だから私は古いハンドルを保持し、別のフラグで妥当性を伝える必要があります。なぜドキュメンテーションはそう言っていないのですか? – EricSchaefer

+3

'WaitForSingleObject'をラップし、' INVALID_HANDLE_VALUE'に対して 'WAIT_FAILED'を返します。これはおそらくコーディングが少なくなるでしょう。 –

関連する問題