potisanのプログラミングメモ

プログラミング素人です。昔の自分を育ててくれたネット情報に少しでも貢献できるよう、情報を貯めていこうと思っています。Windows環境のC++やC#がメインです。

WIL GitHub Wiki カーネルオブジェクトの待機の和訳・改変

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_eventunique_mutexunique_semaphoreを含む)はカーネルハンドルと同じサイズです。

これらのオブジェクトの配列はWaitForMultipleObjectsMsgWaitForMultipleObjectsの呼び出しに適合しています。

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