Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Een proces is een verzameling virtuele geheugenruimte, code, gegevens en systeembronnen. Een thread is code die serieel moet worden uitgevoerd binnen een proces. Een processor voert threads uit, niet processen, dus elke toepassing heeft ten minste één proces en een proces heeft altijd ten minste één thread van uitvoering, ook wel de primaire thread genoemd. Een proces kan meerdere threads bevatten naast de primaire thread.
Processen communiceren met elkaar via berichten, met behulp van de RPC-technologie (Remote Procedure Call) van Microsoft om informatie aan elkaar door te geven. Er is geen verschil tussen een oproep die afkomstig is van een proces op een externe computer en een oproep die afkomstig is van een ander proces op dezelfde computer.
Wanneer een thread wordt uitgevoerd, gaat deze door totdat deze wordt gedood of totdat deze wordt onderbroken door een thread met een hogere prioriteit (door een gebruikersactie of de threadplanner van de kernel). Elke thread kan afzonderlijke codesecties uitvoeren of meerdere threads kunnen dezelfde codesectie uitvoeren. Threads die hetzelfde codeblok uitvoeren, onderhouden afzonderlijke stacks. Elke thread in een proces deelt de globale variabelen en resources van dat proces.
De thread scheduler bepaalt wanneer en hoe vaak een thread moet worden uitgevoerd, volgens een combinatie van het kenmerk prioriteitsklasse van het proces en de basisprioriteit van de thread. U stelt het kenmerk prioriteitsklasse van een proces in door de functie SetPriorityClass aan te roepen en u stelt de basisprioriteit van een thread in met een aanroep naar SetThreadPriority-.
Multithreaded toepassingen moeten twee threading-problemen vermijden: deadlocks en races. Er treedt een impasse op wanneer elke thread wacht tot de andere iets doet. Het besturingselement voor COM-aanroepen helpt impasses in aanroepen tussen objecten te voorkomen. Een raceconditie treedt op wanneer de ene thread eerder wordt voltooid dan een andere waarvan hij afhankelijk is, waardoor de eerste een niet-geïnitialiseerde waarde gebruikt omdat de tweede nog geen geldige waarde heeft geleverd. COM levert bepaalde functies die speciaal zijn ontworpen om raceomstandigheden in out-of-process servers te voorkomen. (Zie Out-of-Process Server Implementation Helpers.)
Het appartement en de COM Threading-architectuur
Hoewel COM het model met één thread per proces ondersteunt dat vóór de introductie van meerdere threads van uitvoering wordt gebruikt, kunt u code schrijven om te profiteren van meerdere threads, wat resulteert in efficiëntere toepassingen, doordat één thread kan worden uitgevoerd terwijl een andere thread wacht totdat een tijdrovende bewerking is voltooid.
Notitie
Het gebruik van meerdere threads is geen garantie voor betere prestaties. Omdat threadfactoring een moeilijk probleem is, veroorzaakt het gebruik van meerdere threads vaak prestatieproblemen. De sleutel is om meerdere threads alleen te gebruiken als u zeker weet wat u doet.
Over het algemeen kun je de COM-threadingarchitectuur het eenvoudigst begrijpen door je voor te stellen dat alle COM-objecten in het proces zijn opgedeeld in groepen die apartments worden genoemd. Een COM-object woont in precies één appartement, in de zin dat zijn methoden wettelijk alleen kunnen worden aangeroepen door een draad die tot dat appartement behoort. Alle andere threads die het object willen aanroepen, moeten via een proxy gaan.
Er zijn twee soorten apartments: single-threaded apartments, en multithreaded apartments.
Important
Een appartementsmodel kiezen (STA versus MTA):
| Appartement |
CoInitializeEx vlag |
Wanneer gebruiken |
|---|---|---|
| STA (één thread) | COINIT_APARTMENTTHREADED |
Uw thread heeft een berichtenlus (UI-threads) of u gebruikt COM-objecten waarvoor een berichtpomp is vereist (ActiveX-besturingselementen, Shell-objecten, slepen en neerzetten). |
| MTA (multithreaded) | COINIT_MULTITHREADED |
Uw thread voert achtergrondwerk uit zonder berichtenlus en de COM-objecten die u gebruikt, zijn thread-veilig of flexibel. |
Veelvoorkomende deadlock-valkuil: Een STA-thread moet berichten verwerken (via GetMessage/DispatchMessage of een equivalent). Als een STA-thread blokkeert op een synchronisatie primitief (bijvoorbeeld WaitForSingleObject) zonder berichten te pompen, zullen binnenkomende COM-oproepen naar objecten in dat appartement nooit worden afgeleverd , waardoor impasses ontstaan. Gebruik CoWaitForMultipleHandles of MsgWaitForMultipleObjects in plaats van ruwe wachtbewerkingen op een STA-thread.
- Appartementen met één thread bestaan uit precies één thread, dus alle COM-objecten die in een appartement met één thread wonen, kunnen alleen methode-aanroepen ontvangen van de ene thread die bij dat appartement hoort. Alle methodeaanroepen naar een COM-object in een appartement met één thread worden gesynchroniseerd met de berichtenwachtrij van windows voor de thread van het appartement met één thread. Een proces met één thread van uitvoering is gewoon een speciaal geval van dit model.
- Multithreaded appartementen bestaan uit een of meer threads, dus alle COM-objecten die in een multithreaded appartement wonen, kunnen methode-aanroepen rechtstreeks ontvangen van een van de threads die deel uitmaken van het multithreaded appartement. Threads in een multithreaded apartment gebruiken een model dat free-threading wordt genoemd. Oproepen naar COM-objecten in een multithreaded appartement worden gesynchroniseerd door de objecten zelf.
Notitie
Zie Single-Threaded en Multithreaded Communicationvoor een beschrijving van de communicatie tussen appartementen met één thread en multithreaded appartementen binnen hetzelfde proces.
Een proces kan uit nul of meer single-threaded apartments en nul of één multithreaded apartment bestaan.
In een proces wordt het hoofd-'apartment' als eerste geïnitialiseerd. In een enkel threaded proces is dit het enige appartement. Oproepparameters worden tussen appartementen marshaled en COM verwerkt de synchronisatie via berichten. Als u meerdere threads in een proces aanwijst om vrij te threaden, bevinden alle gratis threads zich in één appartement, worden parameters rechtstreeks doorgegeven aan een thread in het appartement en moet u alle synchronisatie afhandelen. In een proces met zowel free-threading als appartementthreading bevinden alle gratis threads zich in één appartement en alle andere appartementen zijn appartementen met één thread. Een proces dat COM-werk doet, is een verzameling appartementen met maximaal één multithreaded appartement, maar een willekeurig aantal appartementen met één thread.
De threadingmodellen in COM bieden het mechanisme voor clients en servers die gebruikmaken van verschillende threadingarchitecturen om samen te werken. Aanroepen tussen objecten met verschillende threadingmodellen in verschillende processen worden natuurlijk ondersteund. Vanuit het perspectief van het aanroepende object gedragen alle aanroepen naar objecten buiten een proces zich identiek, ongeacht hoe het object wordt aangeroepen. Vanuit het perspectief van het object dat wordt aangeroepen, gedragen aankomende aanroepen zich op dezelfde manier, ongeacht het threadingmodel van de aanroeper.
Interactie tussen een client en een out-of-process-object is eenvoudig, zelfs wanneer ze verschillende threadingmodellen gebruiken, omdat de client en het object zich in verschillende processen bevinden. COM, dat zich tussen de client en de server bevindt, kan de code leveren waarmee de threadingmodellen met elkaar kunnen samenwerken, met behulp van standaardmarshaling en RPC. Als een object met één thread bijvoorbeeld tegelijkertijd wordt aangeroepen door meerdere gratis threads clients, worden de aanroepen gesynchroniseerd door COM door bijbehorende vensterberichten in de berichtenwachtrij van de server te plaatsen. Het appartement van het object ontvangt één oproep telkens wanneer het berichten ophaalt en verzendt. Er moet echter enige zorg worden besteed om ervoor te zorgen dat in-process servers correct communiceren met hun clients. (Zie Problemen met in-process-serverthreading.)
Het belangrijkste probleem bij het programmeren met een multithreaded-model is om uw codethread-veilig te maken, zodat berichten die zijn bedoeld voor een bepaalde thread alleen naar die thread gaan en toegang tot threads zijn beveiligd.
Zie de volgende onderwerpen voor meer informatie:
- Het threading-model kiezen
- Single-thread-apartments
- Meerdraadse Appartementen
- Single-Threaded en multithreaded communicatie
- Problemen met In-Process-serverthreading
- toegang tot interfaces in verschillende appartementen