2011-03-05 37 views
1

我有用新的創建的對象的指針向量。多個線程通過各種獲取/設置以安全的方式訪問這個向量。但是,線程可能會刪除其中一個對象,在這種情況下,另一個線程指向該對象的指針不再有效。一個方法如何知道指針是否有效?選項1和2實際上似乎運作良好。我不知道他們將如何擴展。什麼是最好的方法?有沒有便攜版本3?使用指針對共享模型進行線程處理

測試爲工作指針有效性的例子:

使用整數而不是指針。散列(std :: map)檢查指針是否仍然有效。公共方法是這樣的:

get(size_t iKey) 
{ 
    if((it = mMap.find(iKey)) != mMap.end()) 
    { 
     TMyType * pMyType = it->second; 
     // do something with pMyType 
    } 
} 

2.的shared_ptr的載體。每個線程都會嘗試在其weak_ptr上調用lock()。如果返回的shared_ptr爲空,我們知道有人在等待時刪除了它。公共方法是這樣的:

get(boost::weak_ptr<TMyType> pMyType) 
{ 
    boost::shared_ptr<TMyType> pGOOD = pMyType.lock(); 
    if (pGOOD != NULL) 
    { 
     // Do something with pGOOD 
    } 
} 

測試空在普通裸指針?這可能嗎?

get(TMyType * pMyType) 
{ 
    if(pMyType != NULL){ //do something } 
} 

回答

2

#3不起作用。刪除一個指針並將其設置爲NULL不會影響指向同一對象的其他指針。沒有任何東西可以用原始指針來檢測對象是否被刪除。

#1實際上是指向指針的指針。如果您始終通過該指針訪問它並能夠鎖定它。如果沒有,如果它在成功獲得後在另一個線程中被刪除會發生什麼?

#2是這種想法的標準實現,並且該模式在許多庫中使用。鎖定一個句柄,得到一個指針。如果你得到它,使用它。如果沒有,它就消失了。

+0

關於#3,是的,我應該知道...... 關於#1,它是一個數字,而不是指針。一個線程調用get()並給定一個數字,一小時後調用set(1234),該方法檢查地圖中是否仍然存在1234。地圖只能通過線程安全調用來訪問,所以效果很好。當另一個線程刪除某些內容時,以下序列化線程將發現其密鑰不再有效。但是,一直在查找哈希值可能無法很好地擴展。 – pcunite 2011-03-05 00:29:05

+0

類似於#1號碼#3號將工作,如果你使它成爲一個指針,而不是指針。 – stefan 2011-03-05 00:31:16

+0

所以,如果我做一個指針指針,它會工作?如果您不介意,請告訴我您的說法。 – pcunite 2011-03-05 00:36:29