2013-07-15 35 views
0

我正在處理與非託管MTA COM對象相關的錯誤。該對象具有鎖定和解鎖方法,並使用一個互斥鎖,該互斥鎖需要調用鎖來調用解鎖的相同線程。是否可以指定使用RPC回調線程?

問題是,當從受管STA線程(使用COM互操作)調用鎖定和解鎖時,調用進入RPC回調線程的COM對象,但使用的回調線程並不總是相同的兩個電話。當它不相同時,解鎖調用失敗,因爲它無法解鎖互斥鎖。

換句話說:

管理STA線程1 - > RPC回調(螺紋11) - >鎖定

管理STA線程1 - > RPC回調(螺紋12) - >解鎖 - >錯誤

我正在嘗試在對修復做出任何決定之前評估所有可能的解決方案。因此,我試圖找出:

1)有沒有辦法阻止首先使用RPC回調線程?在我的測試中,如果我從非託管STA線程調用對象,調用似乎進入調用線程本身。來自.NET的調用需要使用RPC回調線程時有什麼不同?有沒有辦法阻止RPC回調被使用? (除了使用MTA調用線程)

2)如果沒有,是否有辦法強制從同一個託管STA線程使用一致的RPC回調線程?

+1

「在我的測試中,如果我從非託管STA線程調用對象,調用似乎進入調用線程本身。」只有當您在沒有正確編組的公寓之間傳遞原始接口指針時,纔會出現這種情況,這違反了COM線程規則。 –

回答

1

這是針對自由線程服務器設計的。 COM採取你的話,並允許存根使用任意的RPC線程。您不能對線程標識做出任何假設,RPC線程將從池中挑選並回收。不幸的是,當呼叫順序排列時,它往往會選擇相同的一個,所以它看起來會在第一時間正常工作。但是一旦發生多個併發服務器調用,麻煩就開始了。沒有選擇使其具有選擇性,一個自由線程的服務器承諾不關心。這在實踐中也不能很好地發揮作用,它可能會惡化或導致僵局。

因此,您不能使用互斥鎖來實現鎖定,它具有線程關聯性。信號量是一個不錯的選擇。

相關問題