1

我有一個本地的Visual C++ COM對象,我需要使它完全線程安全才能在系統註冊表中合法地將其標記爲「自由線程」。具體而言,我需要確保不超過一個線程同時訪問對象的任何成員變量。這會使對象線程安全嗎?

問題是我幾乎可以肯定,我的COM對象的任何理智的使用者都不會嘗試同時使用來自多個線程的對象。所以我希望解決方案儘可能簡單,只要符合上述要求即可。

這是我想出來的。我添加一個互斥或臨界區作爲對象的成員變量。每個COM暴露的方法都會在返回控制之前在開始和釋放時獲取互斥鎖/節。

我明白,這個解決方案不提供細粒度的訪問,這可能會減慢執行速度,但因爲我想同時訪問不會真的發生,我不在乎這一點。

此解決方案是否足夠?有一個更簡單的解決方案嗎?

+0

如果您確定不會發生併發訪問,爲什麼要使它安全?是否將它標記爲自由線程有任何技術含義,或者您是否試圖做到這一點只是爲了確保? – Marek 2010-03-12 09:33:04

+0

@Marek:Yeap,我需要將它標記爲自由線程以避免COM強制執行編組。我很樂意將它標記爲單元線程。 – sharptooth 2010-03-12 09:48:07

回答

3

該解決方案應該可以工作,但是我建議在關鍵部分使用互斥鎖,因爲它們處理超時,在死鎖情況下提供某種程度的回退。您還需要非常小心,鎖定互斥鎖的函數不會調用已經在同一個線程中鎖定相同互斥鎖的另一個函數。這對你的COM接口不應該是一個問題,只要你不在接口的互斥量之上添加額外的功能。如果COM包含回叫,您可能會遇到問題。

3

如果您確定實際的併發訪問不會在實踐中發生,那麼忽略整個執行並不是一種不合理的方法。