412 Stimmen

Können Sie STA und MTA erklären?

Können Sie STA und MTA mit Ihren eigenen Worten erklären?

Was sind Apartment-Threads und beziehen sie sich nur auf COM? Wenn ja, warum?

378voto

Joseph Daigle Punkte 46087

Das COM-Threading-Modell wird als "Apartment"-Modell bezeichnet, bei dem der Ausführungskontext von initialisierten COM-Objekten entweder einem einzelnen Thread (Single-Thread-Apartment) oder mehreren Threads (Multi-Thread-Apartment) zugeordnet ist. In diesem Modell ist ein COM-Objekt, sobald es in einem Apartment initialisiert wurde, für die Dauer seiner Laufzeit Teil dieses Apartments.

Das STA-Modell wird für COM-Objekte verwendet, die nicht thread-sicher sind. Das bedeutet, dass sie nicht ihre eigene Synchronisierung handhaben. Eine häufige Anwendung ist eine UI-Komponente. Wenn also ein anderer Thread mit dem Objekt interagieren muss (z. B. durch Drücken einer Schaltfläche in einem Formular), wird die Nachricht an den STA-Thread weitergeleitet. Das Windows-Formular-Nachrichtenpumpsystem ist ein Beispiel hierfür.

Wenn das COM-Objekt seine eigene Synchronisierung handhaben kann, dann kann das MTA-Modell verwendet werden, bei dem mehrere Threads mit dem Objekt interagieren können, ohne dass es zu einem Marschall-Aufruf kommt.

219voto

Mike Dimmick Punkte 9542

Es kommt darauf an, wie Aufrufe an Objekte gehandhabt werden und wie viel Schutz sie benötigen. COM-Objekte können die Runtime bitten, sie vor dem gleichzeitigen Aufruf durch mehrere Threads zu schützen; diejenigen, die dies nicht tun, können möglicherweise gleichzeitig von verschiedenen Threads aufgerufen werden, so dass sie ihre eigenen Daten schützen müssen.

Darüber hinaus muss die Laufzeit verhindern, dass ein COM-Objektaufruf die Benutzeroberfläche blockiert, wenn der Aufruf von einem Benutzeroberflächen-Thread aus erfolgt.

Eine Wohnung ist ein Ort, an dem Objekte leben, die einen oder mehrere Threads enthalten. Das Apartment definiert, was bei Aufrufen geschieht. Aufrufe an Objekte in einem Apartment werden von einem beliebigen Thread in diesem Apartment empfangen und verarbeitet, mit der Ausnahme, dass ein Aufruf durch einen Thread, der sich bereits im richtigen Apartment befindet, von diesem selbst verarbeitet wird (d. h. ein direkter Aufruf an das Objekt).

Threads können sich entweder in einem Single-Threaded Apartment befinden (in diesem Fall sind sie der einzige Thread in diesem Apartment) oder in einem Multi-Threaded Apartment. Sie geben dies an, wenn der Thread COM für diesen Thread initialisiert.

Die STA dient in erster Linie der Kompatibilität mit der Benutzeroberfläche, die an einen bestimmten Thread gebunden ist. Eine STA erhält Benachrichtigungen über zu verarbeitende Aufrufe, indem sie eine Fenstermeldung an ein verstecktes Fenster empfängt; wenn sie einen ausgehenden Aufruf tätigt, startet sie eine modale Meldungsschleife, um zu verhindern, dass weitere Fenstermeldungen verarbeitet werden. Sie können einen Nachrichtenfilter angeben, der aufgerufen werden soll, damit Ihre Anwendung auf andere Nachrichten reagieren kann.

Im Gegensatz dazu teilen sich alle MTA-Threads einen einzigen MTA für den Prozess. COM kann einen neuen Worker-Thread starten, um einen eingehenden Anruf zu bearbeiten, wenn keine Threads verfügbar sind, und zwar bis zu einer Poolgrenze. Threads, die ausgehende Anrufe tätigen, blockieren einfach.

Der Einfachheit halber werden wir nur Objekte betrachten, die in DLLs implementiert sind, die in der Registrierung bekannt geben, was sie unterstützen, indem sie die ThreadingModel Wert für den Schlüssel ihrer Klasse. Es gibt vier Optionen:

  • Hauptthema ( ThreadingModel Wert nicht vorhanden). Das Objekt wird im Haupt-UI-Thread des Hosts erstellt, und alle Aufrufe werden an diesen Thread weitergeleitet. Die Klassenfabrik wird nur in diesem Thread aufgerufen.
  • Apartment . Dies bedeutet, dass die Klasse auf jedem beliebigen Thread im Single-Thread-Modus ausgeführt werden kann. Wenn der Thread, der sie erstellt, ein STA-Thread ist, wird das Objekt auf diesem Thread ausgeführt, andernfalls wird es in der Haupt-STA erstellt - wenn keine Haupt-STA existiert, wird ein STA-Thread für sie erstellt. (Das bedeutet, dass MTA-Threads, die Apartment-Objekte erstellen, alle Aufrufe an einen anderen Thread weiterleiten). Da die Klassenfabrik von mehreren STA-Threads gleichzeitig aufgerufen werden kann, muss sie ihre internen Daten davor schützen.
  • Free . Dies weist auf eine Klasse hin, die für die Ausführung im MTA vorgesehen ist. Sie wird immer im MTA geladen, auch wenn sie von einem STA-Thread erstellt wird, was wiederum bedeutet, dass die Aufrufe des STA-Threads geparsht werden. Der Grund dafür ist, dass eine Free Objekt wird im Allgemeinen mit der Erwartung geschrieben, dass es blockiert werden kann.
  • Both . Diese Klassen sind flexibel und werden in jeder Wohnung geladen, in der sie erstellt werden. Sie müssen jedoch so geschrieben werden, dass sie beide Anforderungen erfüllen: Sie müssen ihren internen Zustand vor gleichzeitigen Aufrufen schützen, wenn sie im MTA geladen werden, dürfen aber nicht blockieren, wenn sie in einer STA geladen werden.

Aus dem .NET Framework, verwenden Sie im Grunde nur [STAThread] auf jedem Thread, der UI erstellt. Worker-Threads sollten den MTA verwenden, es sei denn, sie werden die Apartment -markierten COM-Komponenten. In diesem Fall verwenden Sie die STA, um Marshalling-Overhead und Skalierbarkeitsprobleme zu vermeiden, wenn dieselbe Komponente von mehreren Threads aus aufgerufen wird (da jeder Thread nacheinander auf die Komponente warten muss). Es ist viel einfacher, wenn Sie für jeden Thread ein separates COM-Objekt verwenden, unabhängig davon, ob sich die Komponente in der STA oder MTA befindet.

90voto

Weipeng L Punkte 1422

Ich finde die bisherigen Erklärungen zu kauderwelsch. Hier ist meine Erklärung in einfachem Englisch:

STA: Wenn ein Thread ein COM-Objekt erstellt, das auf STA gesetzt ist (beim Aufruf von CoCreateXXX kann ein Flag übergeben werden, das das COM-Objekt auf STA-Modus setzt), dann kann nur dieser Thread auf dieses COM-Objekt zugreifen (das ist, was STA bedeutet - Single Threaded Apartment), andere Threads, die versuchen, Methoden auf diesem COM-Objekt aufzurufen, werden unter der Haube stillschweigend dazu gebracht, Nachrichten an den Thread zu liefern, der das COM-Objekt erstellt (besitzt). Das ist so ähnlich wie die Tatsache, dass nur der Thread, der ein UI-Control erstellt hat, direkt darauf zugreifen kann. Und dieser Mechanismus soll komplizierte Sperr-/Entsperrvorgänge verhindern.

MTA: Wenn ein Thread ein COM-Objekt erstellt, das auf MTA eingestellt ist, kann so gut wie jeder Thread direkt Methoden darauf aufrufen.

Das ist so ziemlich der Kern der Sache. Obwohl es technisch gesehen einige Details gibt, die ich nicht erwähnt habe, wie z. B. im "STA"-Absatz, muss der Ersteller des Threads selbst STA sein. Aber das ist so ziemlich alles, was man wissen muss, um STA/MTA/NA zu verstehen.

27voto

Brian ONeil Punkte 4229

STA (Single Threaded Apartment) ist im Grunde das Konzept, dass nur ein Thread gleichzeitig mit Ihrem Code interagiert. Aufrufe in Ihr Apartment werden über Windows-Nachrichten (unter Verwendung eines nicht sichtbaren Fensters) weitergeleitet. Dies ermöglicht es, Aufrufe in eine Warteschlange zu stellen und auf den Abschluss von Operationen zu warten.

MTA (Multi Threaded Apartment) bedeutet, dass viele Threads gleichzeitig ablaufen können und dass Sie als Entwickler für die Sicherheit der Threads verantwortlich sind.

Es gibt noch viel mehr über Threading-Modelle in COM zu lernen, aber wenn Sie Schwierigkeiten haben zu verstehen, was sie sind, dann würde ich sagen, dass das Verständnis, was die STA ist und wie es funktioniert, der beste Ausgangspunkt wäre, weil die meisten COM-Objekte STAs sind.

Apartment-Threads: Wenn ein Thread im selben Apartment lebt wie das Objekt, das er verwendet, dann ist er ein Apartment-Thread. Ich denke, dies ist nur ein COM-Konzept, weil es nur eine Möglichkeit ist, über die Objekte und Threads zu sprechen, mit denen sie interagieren

22voto

Nick Punkte 13044

Jede EXE, die COM- oder OLE-Steuerelemente hostet, definiert ihren Wohnungsstatus. Der Apartmentstatus ist standardmäßig STA (und sollte für die meisten Programme STA sein).

STA - Alle OLE-Steuerungen müssen zwangsläufig in einer STA untergebracht werden. STA bedeutet, dass Ihr COM-Objekt immer auf dem UI-Thread bearbeitet werden muss und nicht an andere Threads weitergegeben werden kann (ähnlich wie jedes UI-Element in MFC). Ihr Programm kann aber trotzdem viele Threads haben.

MTA - Sie können das COM-Objekt auf jedem Thread in Ihrem Programm bearbeiten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X