Threadpools
Een threadgroep is een verzameling werkthreads die efficiënt asynchrone callbacks uitvoeren namens de toepassing. De threadgroep wordt voornamelijk gebruikt om het aantal toepassingsthreads te verminderen en beheer van de werkrolthreads te bieden. Toepassingen kunnen werkitems in de wachtrij plaatsen, werk koppelen aan wachtbare ingangen, automatisch wachtrijen op basis van een timer en verbinden met I/O.
Architectuur van threadpool
De volgende toepassingen kunnen profiteren van het gebruik van een threadpool:
- Een toepassing die zeer parallel is en een groot aantal kleine werkitems asynchroon kan verzenden (zoals gedistribueerde indexzoekopdrachten of netwerk-I/O).
- Een toepassing die een groot aantal threads maakt en vernietigt die elk gedurende een korte tijd worden uitgevoerd. Het gebruik van de threadpool kan de complexiteit van threadbeheer en de overhead bij het maken en vernietigen van threads verminderen.
- Een toepassing die onafhankelijke werkitems op de achtergrond en parallel verwerkt (zoals het laden van meerdere tabbladen).
- Een toepassing die een exclusieve wachttijd moet uitvoeren op kernelobjecten of die moet blokkeren bij binnenkomende gebeurtenissen op een object. Het gebruik van de threadgroep kan de complexiteit van threadbeheer verminderen en de prestaties verbeteren door het aantal contextswitches te verminderen.
- Een toepassing waarmee aangepaste oberthreads worden gemaakt om te wachten op gebeurtenissen.
De oorspronkelijke threadpool is volledig opnieuw ingericht in Windows Vista. De nieuwe threadgroep is verbeterd omdat deze één werkrolthreadtype biedt (ondersteunt zowel I/O als niet-I/O), geen timerthread gebruikt, één timerwachtrij biedt en een toegewezen permanente thread biedt. Het biedt ook opschoningsgroepen, betere prestaties, meerdere pools per proces die onafhankelijk worden gepland en een nieuwe threadpool-API.
De architectuur van de threadpool bestaat uit het volgende:
- Werkrolthreads die de callback-functies uitvoeren
- Oberthreads die wachten op meerdere wachtgrepen
- Een werkwachtrij
- Een standaardthreadpool voor elk proces
- Een werkfactory die de werkrolthreads beheert
Aanbevolen procedures
De api voor de nieuwe threadgroep biedt meer flexibiliteit en controle dan de oorspronkelijke threadpool-API. Er zijn echter enkele subtiele maar belangrijke verschillen. In de oorspronkelijke API was de wachttijd automatisch opnieuw instellen; in de nieuwe API moet de wachttijd elke keer expliciet opnieuw worden ingesteld. De oorspronkelijke API heeft automatisch imitatie verwerkt, waardoor de beveiligingscontext van het aanroepende proces wordt overgebracht naar de thread. Met de nieuwe API moet de toepassing expliciet de beveiligingscontext instellen.
Hier volgen aanbevolen procedures bij het gebruik van een threadgroep:
De threads van een proces delen de threadgroep. Eén werkrolthread kan meerdere callback-functies één voor één uitvoeren. Deze werkrolthreads worden beheerd door de threadgroep. Beëindig daarom geen thread uit de threadgroep door TerminateThread- op de thread aan te roepen of door ExitThread- aan te roepen vanuit een callback-functie.
Een I/O-aanvraag kan worden uitgevoerd op elke thread in de threadpool. Voor het annuleren van I/O op een threadgroepthread is synchronisatie vereist, omdat de annuleringsfunctie kan worden uitgevoerd op een andere thread dan de thread die de I/O-aanvraag verwerkt, wat kan leiden tot annulering van een onbekende bewerking. U kunt dit voorkomen door altijd de OVERLAPPENDE structuur op te geven waarmee een I/O-aanvraag is gestart bij het aanroepen van CancelIoEx- voor asynchrone I/O, of gebruik uw eigen synchronisatie om ervoor te zorgen dat er geen andere I/O kan worden gestart op de doelthread voordat u de CancelSynchronousIo- of CancelIoEx- functie aanroept.
Schoon alle resources op die zijn gemaakt in de callback-functie voordat u terugkeert van de functie. Deze omvatten TLS, beveiligingscontexten, threadprioriteit en COM-registratie. Callback-functies moeten ook de threadstatus herstellen voordat ze worden geretourneerd.
Wachtgrepen en de bijbehorende objecten actief houden totdat de threadpool heeft aangegeven dat deze is voltooid met de ingang.
Markeer alle threads die wachten op langdurige bewerkingen (zoals I/O-opschoning of opschoning van resources), zodat de threadgroep nieuwe threads kan toewijzen in plaats van te wachten op deze thread.
Voordat u een DLL verwijdert die gebruikmaakt van de threadgroep, annuleert u alle werkitems, I/O, wachtbewerkingen en timers en wacht u tot het uitvoeren van callbacks is voltooid.
Vermijd impasses door afhankelijkheden tussen werkitems en tussen callbacks te elimineren, door ervoor te zorgen dat een callback niet wacht totdat deze is voltooid en door de prioriteit van de thread te behouden.
Wachtrij niet te veel items te snel in een proces met andere onderdelen met behulp van de standaardthreadpool. Er is één standaardthreadpool per proces, inclusief Svchost.exe. Standaard heeft elke threadgroep maximaal 500 werkthreads. De threadgroep probeert meer werkthreads te maken wanneer het aantal werkthreads in de status Gereed/Actief kleiner moet zijn dan het aantal processors.
Vermijd het COM-model met één thread, omdat het niet compatibel is met de threadpool. STA maakt de threadstatus die van invloed kan zijn op het volgende werkitem voor de thread. STA is over het algemeen lang en heeft threadaffiniteit, wat het tegenovergestelde is van de threadpool.
Maak een nieuwe threadpool om de prioriteit en isolatie van threads te beheren, aangepaste kenmerken te maken en de reactiesnelheid mogelijk te verbeteren. Voor extra threadgroepen zijn echter meer systeemresources nodig (threads, kernelgeheugen). Te veel pools verhogen het potentieel voor CPU-conflicten.
Gebruik indien mogelijk een wachtbaar object in plaats van een op APC gebaseerd mechanisme om een threadpoolthread te signaleren. API's werken niet zo goed met threadpoolthreads als andere signaleringsmechanismen omdat het systeem de levensduur van threadpoolthreads beheert, dus het is mogelijk dat een thread wordt beëindigd voordat de melding wordt bezorgd.
Gebruik de extensie voor foutopsporingsprogramma voor threadpools, !tp. Deze opdracht heeft het volgende gebruik:
- adresvlaggen
- obj adresvlaggen
- adresvlaggen
- ober adres
- werkroladres adres
Als het adres nul is, worden alle objecten door de opdracht gedumpt voor pool, ober en werkrol. Als u wachter en werkrol weglaat, wordt de huidige thread weggelaten. De volgende vlaggen worden gedefinieerd: 0x1 (uitvoer met één regel), 0x2 (dumpleden) en 0x4 (werkwachtrij voor dumppool).
Verwante onderwerpen