知識マップ: COM STA/MTA の基礎知識 - スレッドモデルとハングを避ける考え方

記事「COM STA/MTA の基礎知識 - スレッドモデルとハングを避ける考え方」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。

COMのSTA(Single-Threaded Apartment)とMTA(Multi-Threaded Apartment)は、どのスレッドからコンポーネントを呼んでよいかを決めるApartment Modelの2つの形です。STAは1スレッドに1Apartmentで、Apartmentを跨ぐ呼び出しはProxy/Stub経由でマーシャリングされます。別スレッドから呼ばれるSTAはメッセージループを回していないと呼び出しの転送を受け取れずハングし、同期呼び出し中にコールバックが来るパターンもデッドロックになりやすい構造です。MTAは複数スレッドで1Apartmentを共有する代わりに、オブジェクト側にスレッドセーフ設計を要求します。.NETの[STAThread]属性は、このApartment初期化を設定するラッパーにすぎません。

COM STA/MTAの知識マップSTAとMTAというCOMのApartmentモデルが、メッセージループ・マーシャリング・Proxy/Stubとどう関係し、メッセージループの不在がSTAのハングやデッドロックにつながる仕組みを示す図利用する前提とする前提とする利用する前提とする利用する利用する利用する前提とする利用するで構成できる原因になり得る防止する防止する原因になり得る原因になり得る利用する前提とする実装を担う実装を担うSTA(Single-Threaded Apartment)MTA(Multi-Threaded Apartment)COM(コンポーネントオブジェクトモデル)COMアパートメントモデル(STA/MTA)CoInitializeExメッセージループProxy/StubスレッドセーフなCOMオブジェクト設計Windows Forms.NETの[STAThread]/[MTAThread]属性ThreadingModelレジストリ値AutomationIDispatchMIDLSTAのハング(呼び出し転送の停止)MsgWaitForMultipleObjects同期呼び出し中のコールバックによるデッドロック.NET(Core以降)マーシャリング

概念間の関係(全20件)

図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。

主要概念の定義

STA(Single-Threaded Apartment)
1スレッドに1つのApartmentが対応し、そのApartment内のCOMオブジェクトは基本的に生成したスレッドでのみ実行されるCOMのスレッドモデル。
MTA(Multi-Threaded Apartment)
複数のスレッドが1つのApartmentを共有し、どのスレッドからでも直接呼び出せるが、オブジェクト側にスレッドセーフ設計を要求するCOMのスレッドモデル。
COM(コンポーネントオブジェクトモデル)
公開インターフェース、レジストリ登録、Apartment Modelなどを土台にした、Windowsのバイナリ互換コンポーネントモデル。
COMアパートメントモデル(STA/MTA)
どのスレッドからCOMコンポーネントを呼んでよいかを決める、COMのスレッドモデルの約束。
Windows Forms
デスクトップGUIアプリケーションを構築するための.NET/.NET FrameworkのUIフレームワーク。
.NETの[STAThread]/[MTAThread]属性
エントリポイントに付与してそのスレッドのCOM Apartmentを設定する.NETの属性・仕組み。実際にCOMを呼ぶまでは初期化されず、追加で作るスレッドには効かない。
ThreadingModelレジストリ値
HKEY_CLASSES_ROOT\CLSID\{CLSID}\InprocServer32に登録される、COMクラスが要求するApartmentの種類(Apartment/Both/Free等)を示すレジストリ値。
Automation
IDispatchと、そこで使える限られたデータ型を前提にしたCOMの使い方の総称。この範囲に収まっていれば、マーシャリングはOS側のoleaut32.dllが引き受ける。
Proxy/Stub
マーシャリングを担当する一組の部品。呼び出す側に立つProxyと、呼ばれる側で受け取った呼び出しを本物のオブジェクトへ渡すStubからなる。
メッセージループ
スレッドがGetMessage/DispatchMessageなどで自分のウィンドウ宛てのメッセージを順に取り出し処理し続ける仕組み。入力・描画・イベント処理を担うと同時に、STAが持つOleMainThreadWndClassという隠しウィンドウ宛てに届く、別アパートメントからの呼び出しメッセージもここでディスパッチされる。
MsgWaitForMultipleObjects
メッセージと同期オブジェクトの両方を待てるWin32 API。独自のメッセージループを書かずに、終了通知を受けつつCOMの呼び出しも取りこぼさない待機に使う。
.NET(Core以降)
.NET Frameworkの後継となる、クロスプラットフォーム対応の.NETランタイム(.NET 5以降)。

機械可読データ

このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。