Delen via


Threadpooling

Er zijn veel toepassingen die threads maken die veel tijd doorbrengen in slaaptoestand, wachtend op een gebeurtenis. Andere threads kunnen in een slaapstand gaan en worden periodiek geactiveerd om te controleren op een verandering of om statusinformatie bij te werken. Met thread pooling kunt u threads efficiënter gebruiken door uw toepassing een groep werkthreads te bieden die het systeem beheert. Ten minste één thread bewaakt de status van alle wachtbewerkingen in de wachtrij voor de threadpool. Wanneer een wachtbewerking is voltooid, voert een werkdraad uit de draadpool de bijbehorende callback-functie uit.

In dit onderwerp wordt de oorspronkelijke threadpool-API beschreven. De threadpool-API die is geïntroduceerd in Windows Vista is eenvoudiger, betrouwbaarder, heeft betere prestaties en biedt meer flexibiliteit voor ontwikkelaars. Zie Thread Poolsvoor meer informatie over de huidige threadpool-API.

U kunt ook werkitems in de wachtrij plaatsen die niet zijn gerelateerd aan een wachtbewerking naar de threadgroep. Als u wilt aanvragen dat een werkitem wordt verwerkt door een thread in de threadpool, roept u de functie QueueUserWorkItem aan. Deze functie gebruikt een parameter voor de functie die wordt aangeroepen door de thread die is geselecteerd in de threadgroep. Er is geen manier om een werkitem te annuleren nadat het in de wachtrij is geplaatst.

Timerwachtrijtimers en geregistreerde wachtbewerkingen gebruiken ook de threadpool. Hun callback-functies worden in de wachtrij geplaatst in de threadpool. U kunt ook de functie BindIoCompletionCallback gebruiken om asynchrone I/O-bewerkingen te posten. Na voltooiing van de I/O wordt de callback uitgevoerd door een threadpoolthread.

De threadgroep wordt voor het eerst gemaakt wanneer u QueueUserWorkItem of BindIoCompletionCallbackaanroept, of wanneer een timerwachtrij-timer of een geregistreerde wachtbewerking een callbackfunctie in de wachtrij plaatst. Standaard is het aantal threads dat in de threadgroep kan worden gemaakt ongeveer 500. Elke thread maakt gebruik van de standaardstackgrootte en wordt uitgevoerd op de standaardprioriteit.

Er zijn twee typen werkthreads in de threadgroep: I/O en niet-I/O. Een I/O-werkdraad is een thread die wacht in een waarschuwbare wachtstand. Werkitems worden in de wachtrij geplaatst voor I/O-werkthreads als asynchrone procedureaanroepen (APC). U moet een werkitem in de wachtrij plaatsen bij een I/O-werkthread als dit moet worden uitgevoerd in een thread die in een waakzame toestand wacht.

Een niet-I/O-gebaseerde werkdraad wacht op I/O-voltooiingspoorten. Het gebruik van niet-I/O-werkthreads is efficiënter dan het gebruik van I/O-werkthreads. Daarom moet u waar mogelijk werkthreads gebruiken die geen I/O-bewerking uitvoeren. Zowel I/O- als niet-I/O-werkthreads sluiten niet af als er asynchrone I/O-aanvragen in behandeling zijn. Beide typen threads kunnen worden gebruikt door werkitems die asynchrone I/O-voltooiingsaanvragen initiëren. Vermijd echter het in niet-I/O-werkthreads plaatsen van asynchrone I/O-voltooiingsaanvragen als het lang kan duren voordat ze zijn voltooid.

Als u gebruik wilt maken van threadpooling, moeten de werkitems en alle functies die ze aanroepen threadpool-veilig zijn. Een veilige functie gaat er niet van uit dat de thread die deze uitvoert een toegewezen of permanente thread is. Over het algemeen moet u het gebruik van lokale opslag van threads of het maken van een asynchrone aanroep waarvoor een permanente thread is vereist, zoals de RegNotifyChangeKeyValue functie. nl-NL: Dergelijke functies kunnen echter worden aangeroepen op een toegewijde thread (aangemaakt door de toepassing) of in de wachtrij worden geplaatst voor een aanhoudende werkdraad (met behulp van QueueUserWorkItem met de optie WT_EXECUTEINPERSISTENTTHREAD).

waarschuwings-I/O-

asynchrone procedureaanroepen

I/O-voltooiingspoorten

Draadpools