ReleaseSemaphore 関数 (synchapi.h)

指定したセマフォ オブジェクトの数を指定した量だけ増やします。

構文

BOOL ReleaseSemaphore(
  [in]            HANDLE hSemaphore,
  [in]            LONG   lReleaseCount,
  [out, optional] LPLONG lpPreviousCount
);

パラメーター

[in] hSemaphore

セマフォ オブジェクトへのハンドル。 CreateSemaphore または OpenSemaphore 関数は、このハンドルを返します。

このハンドルには、 SEMAPHORE_MODIFY_STATE アクセス権が必要です。 詳細については、「 同期オブジェクトのセキュリティとアクセス権」を参照してください。

[in] lReleaseCount

セマフォ オブジェクトの現在の数を増やす量。 0 より大きい値である必要があります。 指定した量によってセマフォのカウントがセマフォの作成時に指定された最大カウントを超える場合、カウントは変更されず、関数は FALSE を返します

[out, optional] lpPreviousCount

セマフォの前のカウントを受け取る変数へのポインター。 前の数が不要な場合、このパラメーターは NULL にすることができます。

戻り値

関数が成功すると、戻り値は 0 以外になります。

関数が失敗した場合は、0 を返します。 詳細なエラー情報を得るには、GetLastError を呼び出します。

解説

セマフォ オブジェクトの状態は、カウントが 0 より大きい場合に通知され、カウントが 0 に等しい場合は非割り当てになります。 CreateSemaphore 関数を呼び出すプロセスは、セマフォの初期カウントを指定します。 セマフォのシグナル状態のために待機中のスレッドが解放されるたびに、セマフォの数は 1 ずつ減少します。

通常、アプリケーションではセマフォを使用して、リソースを使用するスレッドの数を制限します。 スレッドはリソースを使用する前に、 待機関数の 1 つの呼び出しでセマフォ ハンドルを指定します。 待機関数が返されると、セマフォのカウントが 1 ずつ減少します。 リソースの使用が完了すると、スレッドは ReleaseSemaphore を呼び出してセマフォの数を 1 ずつ増やします。

ReleaseSemaphore のもう 1 つの用途は、アプリケーションの初期化中です。 アプリケーションは、初期カウントが 0 のセマフォを作成できます。 これにより、セマフォの状態が非署名に設定され、すべてのスレッドが保護されたリソースにアクセスできなくなります。 アプリケーションは初期化を完了すると、 ReleaseSemaphore を使用してカウントを最大値に増やし、保護されたリソースへの通常のアクセスを許可します。

lReleaseCount を負の数にできないため、ReleaseSemaphore を使用してセマフォ オブジェクトの数を減らすことはできません。 アクセスを一時的に制限または削減するには、セマフォ数が十分に減るまで、タイムアウト間隔が 0 の WaitForSingleObject 関数を呼び出すループを作成します。 (他のスレッドは、このループの実行中にカウントを減らすことができます。アクセスを復元するには、リリース数がループ内で WaitForSingleObject が呼び出された回数と等しい ReleaseSemaphore を呼び出します。

ReleaseSemaphore を使用する例については、「セマフォ オブジェクトの使用」を参照してください。

要件

要件
サポートされている最小のクライアント Windows XP [デスクトップ アプリ | UWP アプリ]
サポートされている最小のサーバー Windows Server 2003 [デスクトップ アプリのみ | UWP アプリ]
対象プラットフォーム Windows
ヘッダー synchapi.h (Windows Server 2003、Windows Vista、Windows 7、Windows Server 2008 Windows Server 2008 R2 の Windows.h を含む)
Library Kernel32.lib
[DLL] Kernel32.dll

関連項目

CreateSemaphore

OpenSemaphore

セマフォ オブジェクト

同期関数