2011-03-05 36 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