我有用新的創建的對象的指針向量。多個線程通過各種獲取/設置以安全的方式訪問這個向量。但是,線程可能會刪除其中一個對象,在這種情況下,另一個線程指向該對象的指針不再有效。一個方法如何知道指針是否有效?選項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 }
}
關於#3,是的,我應該知道...... 關於#1,它是一個數字,而不是指針。一個線程調用get()並給定一個數字,一小時後調用set(1234),該方法檢查地圖中是否仍然存在1234。地圖只能通過線程安全調用來訪問,所以效果很好。當另一個線程刪除某些內容時,以下序列化線程將發現其密鑰不再有效。但是,一直在查找哈希值可能無法很好地擴展。 – pcunite 2011-03-05 00:29:05
類似於#1號碼#3號將工作,如果你使它成爲一個指針,而不是指針。 – stefan 2011-03-05 00:31:16
所以,如果我做一個指針指針,它會工作?如果您不介意,請告訴我您的說法。 – pcunite 2011-03-05 00:36:29