MicrosoftがGitHubでMITライセンス公開しているWILのGitHub Wikiの記事を和訳・改変したものです。素人による翻訳なので、誤訳や著作権上の問題などありましたらご連絡いただけますと幸いです。
カーネルオブジェクトの待機(原題:Waiting on kernel objects)
Raymond Chen、2021/4/13、リビジョン3個
単一オブジェクトの待機
handle_wait
関数はWaitForSingleObject
関数のラッパーです。任意の待機可能なカーネルオブジェクトを待機します。オプションでタイムアウト時間を指定可能です。
bool handle_wait(HANDLE handle, DWORD dwMilliseconds = INFINITE) noexcept;
戻り値はtrue
なら成功、false
ならタイムアウトを表します。
無効なハンドルや廃棄済みのミューテックスなど、その他の場合はフェイルファストします。 各同期オブジェクトは待機用のメソッドを公開しています。
イベントの待機では、
unique_event.wait()
メソッドを使います。ミューテックスの待機とスコープ脱出時の自動解放では、
unique_mutex.acquire
メソッドを使います。セマフォの待機とスコープ脱出時の自動解放では、
unique_semaphore.acquire
メソッドを使います。
複数オブジェクトの待機
unique_handle
クラス(unique_event
、unique_mutex
、unique_semaphore
を含む)はカーネルハンドルと同じサイズです。
これらのオブジェクトの配列はWaitForMultipleObjects
やMsgWaitForMultipleObjects
の呼び出しに適合しています。
std::vector<wil::unique_handle> handles; WaitForMultipleObjects(handles.size(), handles.data()->addressof(), TRUE, TIMEOUT); wil::unique_handle handles[2]; WaitForMultipleObjects(ARRAYSIZE(handles), handles[0].addressof(), TRUE, TIMEOUT); // 間違え!「&」演算子はハンドルを閉じてしまいます。 WaitForMultipleObjects(handles.size(), &handles[0], TRUE, TIMEOUT);
著作権表示
この記事は以下の著作物を使用しています。
Copyright (c) Microsoft Corporation. All rights reserved. https://github.com/microsoft/wil/blob/master/LICENSE