公寓是邏輯概念,作業系統僅為執行緒/程序配置資源。COM 引入公寓模型(STA/MTA),根本目的是在多執行緒環境下同步存取元件,免除開發者自行實作同步控制的負擔。
呼叫 CoInitializeEx(COINIT_APARTMENTTHREADED) 時,系統自動建立隱含視窗及其訊息佇列。外部執行緒呼叫 STA 內物件方法時,呼叫被封裝為訊息放入佇列。訊息佇列的線性特性天然實現同步序列化。
文獻雖未明述,但 MTA 應同樣擁有隱含視窗佇列機制,以相同方式達成同步。
COM 介面指標與公寓綁定,不可跨公寓直接使用。跨公寓傳遞需經過封送:
CoMarshalInterThreadInterfaceInStream 將指標封送至資料流。CoGetInterfaceAndReleaseStream 反封送,取得Proxy(代理)指標。STA2 拿到的是指向 Proxy 的指標,而非真實物件指標。
STA2 透過 Proxy 呼叫方法,Proxy 將呼叫封裝放入 STA1 的訊息佇列,由 STA1 執行緒取出執行,回傳結果再透過 Proxy 送回。這也是「調度」。
理解公寓本質是「同步服務提供者」而非「隔離邊界」,有助於設計高效能 COM 系統:對於高頻呼叫物件,可考慮實作免公寓或自行同步,避免訊息佇列延遲;對於 UI 物件,善用 STA 天然同步特性簡化開發。