C28648

警告 C28648: PulseEvent は信頼性の低い関数です

同期オブジェクトを待機しているスレッドは、カーネル モード APC によって待機状態が一時的に解除されて、APC の完了後に待機状態に戻ることがあります。 スレッドが待機状態から解除されている間に PulseEvent の呼び出しが発生した場合、スレッドは解放されず、いつまでも "ハング" の状態になります。 これは、PulseEvent が呼び出された時点で待機しているスレッドのみが解放されるためです。

PulseEvent の用法を修正する方法の一部を次に示します。

  • イベントを待機しているスレッドのうち 1 つだけを解放する必要があり、そのイベントが手動リセット イベントである場合は、それを自動リセット イベントに変更し、PulseEvent ではなく SetEvent を呼び出します。

  • イベントを待機しているスレッドのうち 1 つだけを解放する必要があり、そのイベントが自動リセット イベントである場合は、PulseEvent ではなく SetEvent を呼び出します。

  • イベントを待機しているすべてのスレッドを解放する必要があり、そのイベントが手動リセット イベントである場合は、別の種類の同期オブジェクト (セマフォなど) を使用するようにコードを再設計します。

  • イベントを待機しているすべてのスレッドを解放する必要があり、そのイベントが自動リセット イベントである場合は、PulseEvent ではなく SetEvent を呼び出します (PulseEvent の元の呼び出しでは、1 つのスレッドのみが解放されていました)。