知識マップ: 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初期化を設定するラッパーにすぎません。
flowchart LR
accTitle: COM STA/MTAの知識マップ
accDescr: STAとMTAというCOMのApartmentモデルが、メッセージループ・マーシャリング・Proxy/Stubとどう関係し、メッセージループの不在がSTAのハングやデッドロックにつながる仕組みを示す図
sta["STA(Single-Threaded Apartment)"]
mta["MTA(Multi-Threaded Apartment)"]
com["COM(コンポーネントオブジェクトモデル)"]
com_apartment_model["COMアパートメントモデル(STA/MTA)"]
coinitializeex["CoInitializeEx"]
message_loop["メッセージループ"]
proxy_stub["Proxy/Stub"]
thread_safe_com_object["スレッドセーフなCOMオブジェクト設計"]
windows_forms["Windows Forms"]
stathread_attribute[".NETの[STAThread]/[MTAThread]属性"]
threadingmodel_registry["ThreadingModelレジストリ値"]
com_automation["Automation"]
idispatch["IDispatch"]
midl["MIDL"]
sta_hang["STAのハング(呼び出し転送の停止)"]
msgwaitformultipleobjects["MsgWaitForMultipleObjects"]
sta_callback_deadlock["同期呼び出し中のコールバックによるデッドロック"]
dotnet[".NET(Core以降)"]
com_marshaling["マーシャリング"]
com -->|"利用する"| com_apartment_model
com_apartment_model -->|"前提とする"| coinitializeex
sta -->|"前提とする"| message_loop
sta -.->|"利用する"| proxy_stub
mta -->|"前提とする"| thread_safe_com_object
windows_forms -.->|"利用する"| sta
windows_forms -->|"利用する"| message_loop
stathread_attribute -->|"利用する"| coinitializeex
threadingmodel_registry -.->|"前提とする"| sta
com_automation -->|"利用する"| idispatch
proxy_stub -.->|"で構成できる"| midl
sta -.->|"原因になり得る"| sta_hang
message_loop -->|"防止する"| sta_hang
msgwaitformultipleobjects -.->|"防止する"| sta_hang
sta -.->|"原因になり得る"| sta_callback_deadlock
dotnet -.->|"原因になり得る"| sta_hang
mta -.->|"利用する"| proxy_stub
stathread_attribute -->|"前提とする"| com_apartment_model
proxy_stub -->|"実装を担う"| com_marshaling
com_automation -->|"実装を担う"| com_marshaling
概念間の関係(全20件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- COM(コンポーネントオブジェクトモデル)はCOMアパートメントモデル(STA/MTA)を利用します。
- COMアパートメントモデル(STA/MTA)はCoInitializeExを前提とします。
- STA(Single-Threaded Apartment)はメッセージループを前提とします。
- STA(Single-Threaded Apartment)はProxy/Stubを利用します。
- MTA(Multi-Threaded Apartment)はスレッドセーフなCOMオブジェクト設計を前提とします。
- Windows FormsはSTA(Single-Threaded Apartment)を利用します。
- Windows Formsはメッセージループを利用します。
- .NETの[STAThread]/[MTAThread]属性はCoInitializeExを利用します。
- ThreadingModelレジストリ値はSTA(Single-Threaded Apartment)を前提とします。
- AutomationはIDispatchを利用します。
- Proxy/StubはMIDLで構成できます。
- STA(Single-Threaded Apartment)はSTAのハング(呼び出し転送の停止)の原因になることがあります。
- メッセージループはSTAのハング(呼び出し転送の停止)を防ぎます。
- MsgWaitForMultipleObjectsはSTAのハング(呼び出し転送の停止)を防ぎます。
- STA(Single-Threaded Apartment)は同期呼び出し中のコールバックによるデッドロックの原因になることがあります。
- .NET(Core以降)はSTAのハング(呼び出し転送の停止)の原因になることがあります。
- MTA(Multi-Threaded Apartment)はProxy/Stubを利用します。
- .NETの[STAThread]/[MTAThread]属性はCOMアパートメントモデル(STA/MTA)を前提とします。
- Proxy/Stubはマーシャリングの実装を担います。
- Automationはマーシャリングの実装を担います。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。