Możesz wyjaśnić STA i MTA?

Czy możesz wyjaśnić STA i MTA własnymi słowami?

Ponadto, czym są wątki mieszkaniowe i czy odnoszą się tylko do COM? Jeśli tak, to dlaczego?

Author: Peter Mortensen, 2008-09-24

7 answers

Model wątku COM nazywa się modelem "Apartament", gdzie kontekst wykonania zainicjowanych obiektów COM jest powiązany z pojedynczym wątkiem (Single Thread Apartment) lub wieloma wątkami (Multi Thread Apartment). W tym modelu obiekt COM, raz zainicjowany w mieszkaniu, jest częścią tego mieszkania na czas jego działania.

Model STA jest używany dla obiektów COM, które nie są bezpieczne dla wątków. Oznacza to, że nie obsługują własnej synchronizacji. Powszechnym zastosowaniem jest to komponent interfejsu użytkownika. Jeśli więc inny wątek musi wejść w interakcję z obiektem (np. nacisnąć przycisk w formularzu), to wiadomość jest przenoszona na wątek STA. Przykładem tego jest system pompowania wiadomości windows forms.

Jeśli obiekt COM może obsłużyć własną synchronizację, można użyć modelu MTA, w którym wiele wątków może wchodzić w interakcję z obiektem bez wywołania marshalled.

 330
Author: Joseph Daigle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-13 21:21:44

Wszystko zależy od sposobu obsługi wywołań do obiektów i ochrony, jakiej potrzebują. Obiekty COM mogą poprosić runtime o zabezpieczenie ich przed wywołaniem przez wiele wątków w tym samym czasie; te, które nie mogą być wywoływane jednocześnie z różnych wątków, więc muszą chronić własne dane.

Ponadto, runtime musi zapobiec blokowaniu interfejsu użytkownika przez wywołanie obiektu COM, jeśli wywołanie jest wykonywane z interfejsu użytkownika nić.

Mieszkanie jest miejscem do życia obiektów, które zawierają jeden lub więcej wątków. Mieszkanie określa, co się dzieje, gdy połączenia są wykonywane. Wywołania do obiektów w apartamencie będą odbierane i przetwarzane na każdym wątku w tym apartamencie, z wyjątkiem, że wywołanie przez wątek już we właściwym apartamencie jest przetwarzane przez siebie (tj. bezpośrednie wywołanie do obiektu).

Gwinty mogą być albo w mieszkaniu jednowątkowym (w takim przypadku są jedynym gwint w tym mieszkaniu) lub w mieszkaniu wielowątkowym. Określają, który wątek inicjalizuje COM dla tego wątku.

STA służy przede wszystkim kompatybilności z interfejsem użytkownika, który jest związany z określonym wątkiem. STA otrzymuje powiadomienia o połączeniach do przetworzenia, odbierając wiadomość okienną do ukrytego okna; gdy wykonuje połączenie wychodzące, uruchamia pętlę komunikatów modalnych, aby zapobiec przetwarzaniu innych komunikatów okiennych. Możesz określić filtr wiadomości, który ma być wywołany, aby Twoja aplikacja mogła odpowiadać na inne wiadomości.

Dla kontrastu wszystkie wątki MTA dzielą jeden MTA dla procesu. COM może uruchomić nowy wątek roboczy do obsługi połączenia przychodzącego, jeśli nie są dostępne wątki, do limitu puli. Wątki wykonujące połączenia wychodzące po prostu blokują.

Dla uproszczenia weźmiemy pod uwagę tylko obiekty zaimplementowane w bibliotekach DLL, które reklamują w Rejestrze to, co obsługują, ustawiając wartość ThreadingModel dla klucza ich klasy. Są cztery opcje:

  • Main thread (ThreadingModel wartość nie występuje). Obiekt jest tworzony w głównym wątku interfejsu hosta, a wszystkie wywołania są przenoszone do tego wątku. Klasa factory będzie wywoływana tylko w tym wątku.
  • Apartment. Oznacza to, że klasa może działać na dowolnym wątku jednowątkowym. Jeśli wątek, który go tworzy, jest wątkiem STA, obiekt będzie działał w tym wątku, w przeciwnym razie zostanie utworzony w głównym wątku - jeśli nie istnieje główny wątek, zostanie utworzony wątek STA za to. (Oznacza to, że wątki MTA, które tworzą obiekty mieszkalne, będą przenosić wszystkie wywołania do innego wątku.) Klasa factory może być wywoływana jednocześnie przez wiele wątków STA, więc musi przed tym chronić swoje wewnętrzne dane.
  • Free. Oznacza to klasę zaprojektowaną do działania w MTA. Zawsze będzie ładować się w MTA, nawet jeśli jest tworzony przez wątek STA, CO ponownie oznacza, że wywołania wątku STA będą przenoszone. Dzieje się tak dlatego, że obiekt {[3] } jest zazwyczaj zapisywany za pomocą oczekiwanie, że może zablokować.
  • Both. Klasy te są elastyczne i ładują się w każdym mieszkaniu, z którego zostały utworzone. Muszą być napisane tak, aby pasowały do obu zestawów wymagań: muszą chronić swój stan wewnętrzny przed jednoczesnymi wywołaniami, w przypadku, gdy są ładowane w MTA, ale nie mogą blokować, w przypadku, gdy są ładowane w STA.

Z. NET Framework, w zasadzie wystarczy użyć [STAThread] na dowolnym wątku, który tworzy UI. Wątki robocze powinny korzystać z MTA, chyba że są będzie używać komponentów COM oznaczonych Apartment, w takim przypadku użyj STA, aby uniknąć problemów ze skalowalnością, jeśli ten sam komponent jest wywoływany z wielu wątków (ponieważ każdy wątek będzie musiał czekać na komponent z kolei). Jest to o wiele łatwiejsze, jeśli używasz osobnego obiektu COM na wątek, niezależnie od tego, czy komponent znajduje się w STA czy MTA.

 193
Author: Mike Dimmick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-19 09:56:20

Uważam istniejące wyjaśnienia za zbyt pochłonięte. Oto moje wyjaśnienie w prostym języku Angielskim:

STA: Jeśli wątek tworzy obiekt COM, który jest ustawiony na STA( podczas wywoływania CoCreateXXX można przekazać flagę, która ustawia obiekt COM w tryb STA), to tylko ten wątek może uzyskać dostęp do tego obiektu COM( to właśnie oznacza STA-Single Threaded Apartment), inny wątek próbujący wywołać metody na tym obiekcie COM jest pod maską po cichu zamieniony w dostarczanie wiadomości do wątku, który tworzy) obiekt COM. Jest to bardzo podobne do faktu, że tylko wątek, który stworzył kontrolę interfejsu, może uzyskać do niego bezpośredni dostęp. Mechanizm ten ma zapobiegać skomplikowanym operacjom blokowania / odblokowywania.

MTA: Jeśli wątek tworzy obiekt COM, który jest ustawiony na MTA, to prawie każdy wątek może bezpośrednio wywoływać na nim metody.

W tym tkwi sedno sprawy. Chociaż technicznie są pewne szczegóły, o których nie wspomniałem, takie jak w akapicie "STA", wątek twórcy musi być sam w sobie STA. Ale to jest prawie wszystko, co musisz wiedzieć, aby zrozumieć STA/MTA / NA.

 67
Author: Weipeng L,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-02 04:00:33

STA (Single Threaded Apartment) jest w zasadzie koncepcją, że tylko jeden wątek będzie współdziałał z Twoim kodem na raz. Połączenia do Twojego mieszkania są wysyłane za pomocą komunikatów windows (za pomocą niewidocznego) okna. Pozwala to na kolejkowanie połączeń i oczekiwanie na zakończenie operacji.

MTA (Multi Threaded Apartment) jest miejscem, w którym wiele wątków może działać w tym samym czasie, a Ty jako deweloper zajmujesz się zabezpieczeniami wątków.

Jest o wiele więcej do nauczenia jeśli chodzi o modele wątkowe w COM, ale jeśli masz problemy ze zrozumieniem, czym one są, powiedziałbym, że zrozumienie, czym jest STA i jak działa, byłoby najlepszym miejscem na początek, ponieważ większość obiektów COM to STA.

Wątki mieszkalne, jeśli wątek mieszka w tym samym mieszkaniu co obiekt, którego używa, to jest to wątek mieszkalny. Myślę, że jest to tylko koncepcja COM, ponieważ jest to tylko sposób mówienia o przedmiotach i wątkach, z którymi wchodzą w interakcję ...

 18
Author: Brian ONeil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-24 13:56:52

Każdy EXE, który hostuje kontrolki COM lub OLE, definiuje jego stan mieszkania. Stan mieszkania jest domyślnie STA (a dla większości programów powinien być STA).

STA - wszystkie kontrole OLE z konieczności muszą żyć w STA. STA oznacza, że Twój COM-obiekt musi być zawsze manipulowany w wątku UI i nie może być przekazywany do innych wątków (podobnie jak każdy element UI w MFC). Jednak twój program może nadal mieć wiele wątków.

MTA - można manipulować obiektem COM na dowolny wątek w twoim programie.

 17
Author: Nick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-24 13:44:10

Jak rozumiem, 'Apartament' jest używany do ochrony obiektów COM przed problemami wielowątkowymi.

Jeśli obiekt COM nie jest bezpieczny dla wątków, powinien zadeklarować go jako obiekt STA. Wtedy tylko wątek, który go tworzy, może uzyskać do niego dostęp. Wątek tworzenia powinien zadeklarować się jako wątek STA. Pod maską wątek przechowuje informacje o STA w swoim TLS (Thread Local Storage). Nazywamy to zachowanie, ponieważ wątek wchodzi do mieszkania STA. Gdy inne wątki chcą uzyskać dostęp do tego COM obiekt, powinien mieć dostęp do wątku tworzenia. Zasadniczo wątek tworzenia wykorzystuje mechanizm komunikatów do przetwarzania wywołań w-bound.

Jeśli obiekt COM jest bezpieczny dla wątków, powinien zadeklarować go jako obiekt MTA. Do obiektu MTA można uzyskać dostęp za pomocą wielu wątków.

 11
Author: Kevin C.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-21 03:11:25

Kod, który wywołuje biblioteki DLL obiektów COM (na przykład do odczytu zastrzeżonych plików danych), może działać dobrze w interfejsie użytkownika, ale tajemniczo wisi od usługi. Powodem jest to, że od. Net 2.0 interfejsy użytkownika przyjmują STA (thread-safe), podczas gdy usługi przyjmują MTA(wcześniej usługi przyjmowały STA). Konieczność utworzenia wątku STA dla każdego połączenia COM w usłudze może dodać znaczne koszty.

 4
Author: user2696845,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-30 14:19:42