Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

COM & Threading The Basics Frank Lange Michael Willers Microsoft GmbH.

Ähnliche Präsentationen


Präsentation zum Thema: "COM & Threading The Basics Frank Lange Michael Willers Microsoft GmbH."—  Präsentation transkript:

1 COM & Threading The Basics Frank Lange Michael Willers Microsoft GmbH

2 Warum COM-Threading? Wie funktionierts? Wo gibts weitere Infos? Agenda

3 Object (Instanz 1) Object Thread 2 Object (Instanz 2) Object Thread 1 Zwei Threads innerhalb eines Prozesses erzeugen das gleiche COM-Object. Ist der COM-Server eine DLL (in-proc) dann greifen die Methoden beider Objektinstanzen auf die gleichen globalen Daten zu. Sofern der Zugriff nicht threadsafe ist krachts, wenn beide Threads auf die globalen Daten zugreifen. Globale Daten Warum COM-Threading? Ein einfaches Beispiel

4 ?? ? ? Warum COM-Threading? Was bedeutet Threading Model?!

5 Im Multithread-Betrieb können in bestimmten Situationen keine direkten Methodenaufrufe erfolgen. In diesen Situationen ist Marshalling notwendig; Aufrufe werden langsamer! Wann ist das Marshalling notwendig? Warum COM-Threading? Brauchen Sie performante Objekte?

6 Standardmäßig schützt COM die Objekte vor dem Zugriff konkurrierender Threads (SingleThreading). Zugriffe werden synchronisiert (Standard!) Client braucht nicht darauf zu achten, ob das Objekt threadsafe ist Bei echtem Multithreading muß der Entwickler dafür sorgen, daß die Objekte threadsafe sind !!! Threading wird mit Apartments realisiert. Wie funktionierts? Allgemeines, I

7 Ein Apartment ist eine Gruppe von Objekten innerhalb eines Prozesses. Apartments werden benutzt, um eine Zuordnung zwischen Threads und Objekten herzustellen. Ein Prozeß kann ein oder mehrere Apartments beinhalten. Wie funktionierts? Was bedeutet Apartment?

8 Apartment C Apartment B Apartment A Prozess Y Prozess X Wie funktionierts? Beispiele für Apartments

9 Single-threaded apartments (STAs) pro Apartment nur ein einziger Thread beliebig viele STAs pro Prozess Der innerhalb eines Prozesses zuerst erzeugte STA heißt main STA Multithreaded apartments (MTAs) beliebig viele Threads pro MTA ein Prozess kann nur genau ein MTA beinhalten Wie funktionierts? Was bedeutet Apartment?

10 Jeder Thread, der mit COM-Objekten arbeitet, muß vorher CoInitialize oder CoInitializeEx aufrufen. Mit diesem Aufruf betritt der Thread ein Apartment Jedes Objekt befindet sich in einem Apartment Objekte in unterschiedlichen Apartments können nicht direkt aufgerufen werden. In diesem Fall ist Marshalling notwendig! gilt auch innerhalb eines Prozesses! Wie funktionierts? Allgemeines, II

11 Thread 1 Thread 2 main STA STA Thread 3 MTA Thread 4 Prozess Marshalling Wie funktionierts? Objekte, Threads und Apartments Marshalling

12 Ziel-Apartment ist ein STA… Aufrufe werden an den one and only Thread des STA weitergeleitet und nacheinander abgearbeitet (serially) Aufruf wird mit einer Nachricht realisiert, die an ein von COM erzeugtes hidden window gesendet wird (message queuing!) Ziel-Apartment ist ein MTA… Aufrufe geschehen quasi gleichzeitig (concurrency) via (L)RPC Wie funktionierts? Aufrufe in andere Apartments

13 Der 2. Parameter von CoInitializeEx (COINIT-Wert) legt fest, in welchem Apartment-Typ der Thread läuft. COINIT_APARTMENTTHREADED setzt den Thread in ein STA COINIT_MULTITHREADED setzt den Thread in ein MTA CoInitialize = CoInitializeEx (…, COINIT_APARTMENTTHREADED ) Wie funktionierts? Zuordnung: Threads und Apartments

14 Out-of-proc (EXE) Der Server, in dem sich das Objekt befindet, bestimmt den Apartmenttyp! Die main-Funktion des Servers ruft CoInitialize bzw. CoInitializeEx auf. Reminder: Jeder Thread, der mit COM-Objekten arbeitet, muß diese Funktion aufrufen D.h.: Der Apartmenttyp wird für alle Objekte des Servers festgelegt! ACHTUNG: Wenn der Apartmenttyp MTA ist, müssen alle Objekte des Servers threadsafe sein! Wie funktionierts? Zuordnung: Objekte und Apartments, I

15 In-proc (DLL) Das Threading Model des Objekts bestimmt den Apartmenttyp! Das Threading Model ist in der Registry gespeichert. D.h.: Der Apartmenttyp wird für jedes Objekt einzeln festgelegt! Wie funktionierts? Zuordnung: Objekte und Apartments, II

16 HKEY_CLASSES_ROOTHKEY_CLASSES_ROOT CLSIDCLSID {…}{…} InprocServer32InprocServer32C:\Servers\MyComp.dllC:\Servers\MyComp.dll My Component ApartmentApartmentThreadingModelThreadingModel An dieser Stelle ist das Threading Model eingetragen! Wie funktionierts? Threading Model in der Registry

17 No ThreadingModel value (=Single) Alle Objekte laufen im main STA eines Prozesses Wie funktionierts? Welche Threading Models gibt es?, I

18 ThreadingModel=Apartment Objekte können in jedem STA eines Prozesses laufen ThreadingModel=Free Objekte laufen grundsätzlich nur im one and only MTA eines Prozesses ThreadingModel=Both Objekte können sowohl in einem STA als auch im MTA eines Prozesses laufen Wie funktionierts? Welche Threading Models gibt es?, II

19 COM nimmt an, daß Objekte nicht threadsafe sind. COM beschränkt alle Objekt-Instanzen auf das main STA. Aufrufe von ausserhalb werden synchronisiert und erfolgen indirekt (marshalling) Da alle Instanzen im gleichen Thread laufen kann immer nur eine einzige Instanz Code ausführen. Voila! Thread safety! Wie funktionierts? No Threading Model (=Single)

20 Thread 1 Instanz 1 Instanz 2 Thread 2 main STA Alle anderen Apartments ProxyProxy Methodenaufrufe werden synchronisiert, da ALLE Objekt-Instanzen im gleichen Thread laufen. Somit sind gleichzeitige Zugriffe auf globale Daten nicht möglich. Marshalling (gilt für Zugriffe innerhalb von Methoden) Wie funktionierts? No Threading Model (=Single)

21 COM nimmt an, daß Objekte halbwegs threadsafe sind und setzt Objekt in ein STA. COM synchronisiert Methodenaufrufe innerhalb einzelner Objektinstanzen. Somit sind auch Member einer Instanz geschützt. Methodenaufrufe unterschiedlicher Instanzen können gleichzeitig erfolgen. Wird innerhalb dieser Methoden auf globale Daten zugegriffen, muß dieser Zugriff threadsafe sein. Jeder Thread, der in einem STA läuft kann dort Objekte erstellen. Zugriffe auf diese Objekte können aus MTAs nur indirekt erfolgen (Marshalling). Wie funktionierts? Threading Model=Apartment

22 Thread 1 Instanz 1 Instanz 2 Thread 2 main STA STA Global Daten Globale Daten werden nicht vor überlappenden Lese- und Schreibzugriffen verschiedener Instanzen geschützt und müssen synchronisiert werden. Wie funktionierts? Threading Model=Apartment

23 COM nimmt an, das Objekte threadsafe sind. D.h.: Concurrent calls sind OK. COM braucht Methodenaufrufe nicht zu synchronisieren COM setzt Objekte in den MTA und alle dortigen Threads können direkt, d.h. ohne Marshalling, auf die Objekte zugreifen. Threads, die in STAs laufen können auf die Objekte im MTA nur indirekt zugreifen (Marshalling!). Wie funktionierts? Threading Model=Free

24 COM nimmt an, das Objekte grundsätzlich threadsafe sind. Ein Objekt kann in einem STA oder dem MTA angelegt werden. Dadurch ist sichergestellt, daß das Objekt stets im Apartment des Client-Threads angelegt wird. Es ist egal, ob der Client ein STA-Thread oder ein MTA-Thread ist Der Thread, der das Objekt angelegt hat, kann stets direkt auf das Objekt zugreifen Wie funktionierts? Threading Model=Both

25 Both Kein Eintrag (none) Free ThreadingModel Apartment Direkt Proxy Proxy Proxy Proxy Proxy MTA Thread Alle Threads, die CoInitializeEx COINIT_MULTITHREADED) aufrufen STA Thread Alle weiteren Threads, die CoInitializeEx (COINIT_APARTMENTTHREADED) aufrufen Main STA Thread Allererster Thread, der CoInitializeEx (COINIT_APARTMENTTHREADED) aufruft Wie funktionierts? Wann erfolgt Marshalling?

26 Threading ModelAktion None (Single)nichts ApartmentSynchronisation für Methodenzugriffe auf globale Daten FreeSynchronisation für Methodenzugriffe auf globale Daten und Instanzdaten (Member) BothSynchronisation für Methodenzugriffe auf globale Daten und Instanzdaten (Member) Wie funktionierts? Was muss implementiert werden?

27 Es gibt Objekte, die selbst Worker-Threads erzeugen: Diese Threads sollen vorhandene Schnittstellenzeiger benutzen. Wenn man diese Objekte als "Both" deklariert und in einem STA erzeugt, müssen die Worker- Threads in anderen Apartments erzeugt werden. Schnittstellenzeiger werden alsogemarshalled. Dies kann bei häufigen Aufrufen erhebliche Performanceverluste verursachen. Für diese Fälle kann man mit Free" die Erzeugung im MTA erzwingen. Die Worker- Threads und das Objekt befinden sich dann im selben Apartment. Wie funktionierts? Warum Free und Both

28 No ThreadingModel-Objekte sind einfach zu implementieren, allerdings ist fast immer Marshalling notwendig. ThreadingModel=Apartment- Objekte verbessern die Performance mit relativ wenig Aufwand. ThreadingModel=Free/Both-Objekte haben die beste Performance, sind aber schwierig zu implementieren und zu debuggen. Wie funktionierts? Zusammenfassung - Theading Model

29 Wenn das Threading Model auf Apartment gesetzt ist, dann muß der Zugriff auf globale Daten innerhalb von Objekt-Methoden grundsätzlich threadsafe erfolgen. critical sections Interlocked-functions Sollen die Objekte im MTA laufen müssen alle Operationen innerhalb des Objekts threadsafe sein. Wie funktionierts? Zusammenfassung - Objekt

30 Jeder Thread muß vor dem Benutzen von COM-Objekten CoInitialize(Ex) aufrufen. Thread betritt damit ein Apartment kein Marshalling bei gleichem Apartmenttyp! Schnittstellenzeiger dürfen niemals direkt an Threads in anderen Apartments übergeben werden. Marshalling zwischen unterschiedlichen Apartments! Wie funktionierts? Zusammenfassung - Client

31 Schnittstellenzeiger können zwischen Threads können nur dann direkt übergeben werden, wenn die Threads im gleichen Apartment liegen. Liegen die Threads in unterschiedlichen Appartments ist Marshalling erforderlich. CoMarshalInterThreadInterfaceInStream marshals an interface in one thread CoGetInterfaceAndReleaseStream unmarshals the interface in another Wie funktionierts? Marshalling von Schnittstellenzeigern, I

32 // The following global variable will hold the IStream pointer used by // both threads. COM makes sure the IStream pointer can be safely // used in different apartments. IStream* g_pStream; IMath* pMath; // Marshal the interface pointer in one thread. CoMarshalInterThreadInterfaceInStream (IID_IFace, pMath, g_pStream);. // Unmarshal it in another. IMath* pMath; CoGetInterfaceAndReleaseStream (g_pStream, IID_IFace, (void**) &pMath); // The following global variable will hold the IStream pointer used by // both threads. COM makes sure the IStream pointer can be safely // used in different apartments. IStream* g_pStream; IMath* pMath; // Marshal the interface pointer in one thread. CoMarshalInterThreadInterfaceInStream (IID_IFace, pMath, g_pStream);. // Unmarshal it in another. IMath* pMath; CoGetInterfaceAndReleaseStream (g_pStream, IID_IFace, (void**) &pMath); Ein Stream nimmt immer nur einen Schnittstellenzeiger auf! Wie funktionierts? Marshalling von Schnittstellenzeigern, II

33 Der FTM ist ein COM-Objekt, das ein custom marshalling zur Verfügung stellt. Auf alle Objekte, die den FTM benutzen, kann grundsätzlich direkt zugegriffen werden mehr Speed, aber: hebelt Synchronisations-Mechanismen von COM komplett aus! Wie funktionierts? Free-Threaded Marshaller (FTM)

34 Objekte müssen threadsafe sein, um den FTM zu benutzen. Sofern externe Threads direkten Objekt- zugriff haben, kann COM die Zugriffe nicht synchronisieren! Der FTM sollte nicht von Objekten benutzt werden, die Objekte in anderen Apartments aufrufen. Callbacks können Deadlocks erzeugen Aufrufergebnis kann RPC_E_WRONG_THREAD sein Wie funktionierts? Free-Threaded Marshaller (FTM)

35 Allgemeine Hinweise Multi-Threading: RPC-Call, total blockierend Single-Threading: Messageloop Deshalb: Kein UI mit MTA!!! In-proc-Server (DLLs) werden beim Beenden des Prozesses entsorgt!! Alternative: CoFreeUnusedLibraries oder CoFreeAllLibraries aufrufen OLE32.DLL: COM-Runtime OLEAUT32.DLL: Automation, Standard- Marshalling

36 Wo gibts weitere Infos? msdn online Microsoft Systems Journal diverse Artikel, z.B. Heft 4/1997 (!) Bücher von WROX Press Bücher von Microsoft Press Inside COM, Dale Rogerson Knowledge-Base-Artikel Q150777!!!

37 Fragen!? Uff...

38


Herunterladen ppt "COM & Threading The Basics Frank Lange Michael Willers Microsoft GmbH."

Ähnliche Präsentationen


Google-Anzeigen