Single-threaded apartment oraz Multithreaded apartment.

Dziś trochę czystej teorii dla tych, którzy potrzebują wywoływać komponenty COM. W Internecie znajduje się wiele artykułów o różnicach między STA a MTA. Większość jednak opisuje je dosyć szczegółowo uwzględniając wiele aspektów technicznych i przez to nie zawsze może być to zrozumiałe. Podstawy jednak są bardzo proste i w poście skupie się wyłącznie na nich – szczegóły z pewnością znajdziecie na MSDN.

Przede wszystkim STA, MTA mają znaczenie wyłącznie gdy korzystamy z obiektów COM. To pozostałość po dawnych czasach. Na początku istnienia COM, nie było wielowątkowości i programiści nie musieli martwić się o synchronizację, sekcje krytyczne, semafory, muteksy, deadlock, livelock, zagłodzenie itp… Tworzone biblioteki nie wspierały więc wielowątkowości ponieważ takowa wtedy nie istniała. Problem pojawił się jednak gdy na rynku zaczęły pojawiać się pierwsze programy wielowątkowe. Wiadomo, że te stare biblioteki nadal będą musiały być wykorzystywane. Wprowadzono więc tzw. dwa modele STA oraz MTA.

Dla starych bibliotek używamy STA. W modelu przyjmuje się, że kod COM możemy być jednocześnie wywoływany z jednego wątku – co likwiduje nam problemy z synchronizacją itp. Jeśli zdarzy się, że 2 osobne wątki będą chciały wywołać dany kod, wtedy wywołania są szeregowane w kolejce (Windows Message Pump).

Z kolei w MTA dopuszcza się wywoływanie jednoczesne z różnych wątków. Biblioteki MTA muszę zatem być napisane w sposób “thread-safe”, czyli uwzględniającym wielowątkowość. Trudniejsze wyzwanie ale bardziej wydajne.

Wszystkie aplikacje WPF, WinForms wykorzystują biblioteki COM STA stąd ich wątek główny najczęściej oznaczony jest atrybutem STAThreadAttribute .

One thought on “Single-threaded apartment oraz Multithreaded apartment.”

  1. Hm… wielowątkowość była dużo wcześniej niż COM, ale zdaje się, wynika z tego, że nie była stosowana w Windows. Chyba taki miał być sens 🙂

Leave a Reply

Your email address will not be published.