CloseThreadpoolCleanupGroupMembers 関数 (threadpoolapiset.h)

指定したクリーンアップ グループのメンバーを解放し、すべてのコールバック関数が完了するまで待機し、必要に応じて未処理のコールバック関数を取り消します。

構文

void CloseThreadpoolCleanupGroupMembers(
  [in, out]           PTP_CLEANUP_GROUP ptpcg,
  [in]                BOOL              fCancelPendingCallbacks,
  [in, out, optional] PVOID             pvCleanupContext
);

パラメーター

[in, out] ptpcg

クリーンアップ グループを定義する TP_CLEANUP_GROUP 構造体へのポインター。 CreateThreadpoolCleanupGroup 関数は、このポインターを返します。

[in] fCancelPendingCallbacks

このパラメーターが TRUE の場合、この関数は、まだ開始されていない未処理のコールバックを取り消します。 このパラメーターが FALSE の場合、関数は未処理のコールバック関数の完了を待機します。

[in, out, optional] pvCleanupContext

アプリケーションのクリーンアップ グループ コールバック関数に渡すアプリケーション定義データ。 SetThreadpoolCallbackCleanupGroup を呼び出すときにコールバック関数を指定できます。

戻り値

なし

解説

CloseThreadpoolCleanupGroupMembers 関数は、クリーンアップ グループのメンバーであるすべての作業オブジェクト、待機オブジェクト、タイマー オブジェクトを 1 回の操作で解放することで、スレッド プールコールバック オブジェクトのクリーンアップを簡略化します。 クリーンアップ グループの作成時に指定されたスレッドプール コールバック環境でオブジェクトが作成されると、オブジェクトはクリーンアップ グループのメンバーになります。 詳細については、「 CreateThreadpoolCleanupGroup」を参照してください。

CloseThreadpoolCleanupGroupMembers 関数は、現在実行中のすべてのコールバック関数が終了するまでブロックします。 fCancelPendingCallbacks が TRUE の場合、未処理のコールバックは取り消されます。それ以外の場合、関数は未処理のすべてのコールバックも完了するまでブロックします。 CloseThreadpoolCleanupGroupMembers 関数が戻った後、CloseThreadpoolCleanupGroupMembers が呼び出された時点で、クリーンアップ グループのメンバーであったオブジェクトをアプリケーションで使用しないでください。 また、アプリケーションでは、 CloseThreadpoolWork などの関数を呼び出してオブジェクトを個別に解放しないでください。これは、オブジェクトが既に解放されているためです。

CloseThreadpoolCleanupGroupMembers 関数は、クリーンアップ グループ自体を閉じません。 代わりに、クリーンアップ グループは CloseThreadpoolCleanupGroup 関数が呼び出されるまで保持されます。 また、クリーンアップ グループを閉じても、関連付けられているスレッドプール コールバック環境には影響しません。 コールバック環境は、 DestroyThreadpoolEnvironment を呼び出して破棄されるまで保持されます。

クリーンアップ グループが保持されている限り、クリーンアップ グループの関連付けられたスレッドプール コールバック環境で作成された新しいオブジェクトがクリーンアップ グループに追加されます。 これにより、アプリケーションでクリーンアップ グループを再利用できます。 ただし、 アプリケーションが CloseThreadpoolCleanupGroupMembers を呼び出すコードを新しいオブジェクトを作成するコードと同期しない場合は、エラーが発生する可能性があります。 たとえば、スレッドによって 2 つのスレッド プール作業オブジェクト Work1 と Work2 が作成されたとします。 別のスレッドは CloseThreadpoolCleanupGroupMembers を呼び出します。 スレッドがいつ実行されるかに応じて、次のいずれかが発生する可能性があります。

  • Work1 と Work2 は、既存のメンバーが解放された後にクリーンアップ グループに追加されます。 Work1 と Work2 を送信するコードは成功します。
  • Work1 は、既存のメンバーが解放される前にクリーンアップ グループに追加され、他のメンバーと共に Work1 が解放されます。 次に、Work2 が追加されます。 Work1 を送信するコードでは例外が生成されます。Work2 を送信するコードは成功します。
  • Work1 と Work2 は、既存のメンバーが解放される前にクリーンアップ グループに追加され、Work1 と Work2 の両方が解放されます。 Work1 または Work2 を送信するコードでは、例外が生成されます。
保留中の作業項目を解放せずに待機または取り消すだけの場合は、スレッド プールコールバック関数 ( WaitForThreadpoolIoCallbacksWaitForThreadpoolTimerCallbacksWaitForThreadpoolWaitCallbacksWaitForThreadpoolWorkCallbacks) のいずれかを使用します。

この関数を使用するアプリケーションをコンパイルするには、_WIN32_WINNTを 0x0600 以上として定義します。

例については、「 スレッド プール関数の使用」を参照してください。

要件

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

関連項目

CloseThreadpoolCleanupGroup

CreateThreadpoolCleanupGroup

SetThreadpoolCallbackCleanupGroup

スレッド プール