使用指针线程化共享模型

时间:2011-03-05 00:10:06

标签: c++ multithreading null shared-ptr weak-ptr

我有一个指向使用 new 创建的对象的指针。多个线程以安全的方式使用各种gets / sets访问此向量。但是,线程可能会删除其中一个对象,在这种情况下,另一个线程指向该对象的指针不再有效。方法如何知道指针是否有效?选项1和2实际上似乎运作良好。我不知道他们将如何扩展。什么是最好的方法?是否有便携版3?

测试有效的指针有效性示例:

1。使用整数而不是指针。哈希(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为null,我们知道有人在我们等待时删除了它。公共方法如下:

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

3. 在普通原始指针上测试null?这可能吗?

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

1 个答案:

答案 0 :(得分:2)

#3不起作用。删除指针并将其设置为NULL不会影响指向同一对象的其他指针。使用原始指针无法检测对象是否被删除。

#1实际上是指向指针的指针。如果您始终通过该指针访问它并能够锁定它。如果没有,如果在成功获取后在另一个线程中删除了会发生什么?

#2是这种想法的标准实现,并且该模式在许多库中使用。锁定手柄,获得指针。如果你得到它,请使用它。如果没有,它就消失了。