我有用新的创建的对象的指针向量。多个线程通过各种获取/设置以安全的方式访问这个向量。但是,线程可能会删除其中一个对象,在这种情况下,另一个线程指向该对象的指针不再有效。一个方法如何知道指针是否有效?选项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