CloseThreadpoolCleanupGroupMembers-Funktion (threadpoolapiset.h)

Gibt die Mitglieder der angegebenen Bereinigungsgruppe frei, wartet, bis alle Rückruffunktionen abgeschlossen sind, und bricht optional alle ausstehenden Rückruffunktionen ab.

Syntax

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

Parameter

[in, out] ptpcg

Ein Zeiger auf eine TP_CLEANUP_GROUP Struktur, die die Bereinigungsgruppe definiert. Die Funktion CreateThreadpoolCleanupGroup gibt diesen Zeiger zurück.

[in] fCancelPendingCallbacks

Wenn dieser Parameter TRUE ist, bricht die Funktion ausstehende Rückrufe ab, die noch nicht gestartet wurden. Wenn dieser Parameter FALSE ist, wartet die Funktion, bis ausstehende Rückruffunktionen abgeschlossen sind.

[in, out, optional] pvCleanupContext

Die anwendungsdefinierte Daten, die an die Rückruffunktion der Bereinigungsgruppe der Anwendung übergeben werden sollen. Sie können die Rückruffunktion angeben, wenn Sie SetThreadpoolCallbackCleanupGroup aufrufen.

Rückgabewert

Keine

Bemerkungen

Die Funktion CloseThreadpoolCleanupGroupMembers vereinfacht die Bereinigung von Threadpool-Rückrufobjekten, indem alle Arbeitsobjekte, Warteobjekte und Timerobjekte, die Mitglieder der Bereinigungsgruppe sind, in einem einzigen Vorgang freigegeben werden. Ein Objekt wird Mitglied einer Bereinigungsgruppe, wenn das Objekt mit der Threadpool-Rückrufumgebung erstellt wird, die beim Erstellen der Bereinigungsgruppe angegeben wurde. Weitere Informationen finden Sie unter CreateThreadpoolCleanupGroup.

Die Funktion CloseThreadpoolCleanupGroupMembers blockiert, bis alle aktuell ausgeführten Rückruffunktionen abgeschlossen sind. Wenn fCancelPendingCallbacks true ist, werden ausstehende Rückrufe abgebrochen. Andernfalls blockiert die Funktion, bis alle ausstehenden Rückrufe ebenfalls abgeschlossen sind. Nachdem die Funktion CloseThreadpoolCleanupGroupMembers zurückgegeben wurde, sollte eine Anwendung kein Objekt verwenden, das zum Zeitpunkt des Aufrufs von CloseThreadpoolCleanupGroupMembers Mitglied der Bereinigungsgruppe war. Außerdem sollte eine Anwendung keines der Objekte einzeln freigeben, indem eine Funktion wie CloseThreadpoolWork aufgerufen wird, da die Objekte bereits freigegeben wurden.

Die Funktion CloseThreadpoolCleanupGroupMembers schließt die Bereinigungsgruppe selbst nicht. Stattdessen wird die Bereinigungsgruppe beibehalten, bis die Funktion CloseThreadpoolCleanupGroup aufgerufen wird. Außerdem wirkt sich das Schließen einer Bereinigungsgruppe nicht auf die zugeordnete Threadpool-Rückrufumgebung aus. Die Rückrufumgebung bleibt erhalten, bis sie durch Aufrufen von DestroyThreadpoolEnvironment zerstört wird.

Solange eine Bereinigungsgruppe beibehalten wird, werden der Bereinigungsgruppe neue Objekte hinzugefügt, die mit der zugeordneten Threadpool-Rückrufumgebung der Bereinigungsgruppe erstellt wurden. Dadurch kann eine Anwendung die Bereinigungsgruppe wiederverwenden. Es kann jedoch zu Fehlern führen, wenn die Anwendung keinen Code synchronisiert, der CloseThreadpoolCleanupGroupMembers mit Code zum Erstellen neuer Objekte aufruft. Angenommen, ein Thread erstellt zwei Threadpoolarbeitsobjekte, Work1 und Work2. Ein anderer Thread ruft CloseThreadpoolCleanupGroupMembers auf. Je nachdem, wann die Threads ausgeführt werden, kann eine der folgenden Aktionen auftreten:

  • Work1 und Work2 werden der Bereinigungsgruppe hinzugefügt, nachdem die vorhandenen Mitglieder freigegeben wurden. Code, der Work1 und Work2 übermittelt, ist erfolgreich.
  • Work1 wird der Bereinigungsgruppe hinzugefügt, bevor die vorhandenen Mitglieder freigegeben werden, sodass Work1 zusammen mit anderen Mitgliedern freigegeben wird. Anschließend wird Work2 hinzugefügt. Code, der Work1 übermittelt, generiert eine Ausnahme. Code, der Work2 übermittelt, ist erfolgreich.
  • Work1 und Work2 werden der Bereinigungsgruppe hinzugefügt, bevor die vorhandenen Mitglieder freigegeben werden, wodurch sowohl Work1 als auch Work2 freigegeben werden. Code, der Work1 oder Work2 übermittelt, generiert eine Ausnahme.
Um einfach auf ausstehende Arbeitselemente zu warten oder abzubrechen, ohne sie freizugeben, verwenden Sie eine der Threadpool-Rückruffunktionen: WaitForThreadpoolIoCallbacks, WaitForThreadpoolTimerCallbacks, WaitForThreadpoolWaitCallbacks oder WaitForThreadpoolWorkCallbacks.

Um eine Anwendung zu kompilieren, die diese Funktion verwendet, definieren Sie _WIN32_WINNT als 0x0600 oder höher.

Beispiele

Ein Beispiel finden Sie unter Verwenden der Threadpoolfunktionen.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows Vista [Desktop-Apps | UWP-Apps]
Unterstützte Mindestversion (Server) Windows Server 2008 [Desktop-Apps | UWP-Apps]
Zielplattform Windows
Kopfzeile threadpoolapiset.h (einschließlich Windows.h)
Bibliothek Kernel32.lib
DLL Kernel32.dll

Siehe auch

CloseThreadpoolCleanupGroup

CreateThreadpoolCleanupGroup

SetThreadpoolCallbackCleanupGroup

Threadpools