Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用指针线程化共享模型_C++_Multithreading_Null_Shared Ptr_Weak Ptr - Fatal编程技术网

C++ 使用指针线程化共享模型

C++ 使用指针线程化共享模型,c++,multithreading,null,shared-ptr,weak-ptr,C++,Multithreading,Null,Shared Ptr,Weak Ptr,我有一个指向用new创建的对象的指针向量。多个线程通过各种get/set以安全的方式访问此向量。但是,一个线程可能会删除其中一个对象,在这种情况下,另一个线程指向该对象的指针不再有效。方法如何知道指针是否有效?选项1和2实际上似乎很有效。我不知道它们将如何扩展。最好的方法是什么?有便携式版本3吗 测试有效的指针有效性示例: 1。使用整数而不是指针。散列(std::map)检查指针是否仍然有效。公共方法如下所示: get(size_t iKey) { if((it = mMap.find(i

我有一个指向用new创建的对象的指针向量。多个线程通过各种get/set以安全的方式访问此向量。但是,一个线程可能会删除其中一个对象,在这种情况下,另一个线程指向该对象的指针不再有效。方法如何知道指针是否有效?选项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.具有共享的向量\u ptr。每个线程都试图在其弱线程ptr上调用lock()。如果返回的共享\u ptr为空,我们知道有人在等待时删除了它。公共方法如下所示:

get(boost::weak_ptr<TMyType> pMyType)
{
    boost::shared_ptr<TMyType> pGOOD = pMyType.lock();
    if (pGOOD  != NULL)
    {
         // Do something with pGOOD
    }
} 
#3不起作用。删除指针并将其设置为NULL不会影响指向同一对象的其他指针。您无法使用原始指针来检测对象是否被删除

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


#2是这种思想的标准实现,许多图书馆都使用这种模式。锁定句柄,获取指针。如果你得到它,就用它。如果没有,它就不见了。

关于#3,是的,我应该知道。。。关于#1,它是一个数字,而不是指针。线程调用get()并获得一个数字,一小时后它调用set(1234),该方法检查1234是否仍然存在于映射中。映射只能通过线程安全调用访问,因此它工作良好。当另一个线程删除某些内容时,以下序列化线程发现其密钥不再有效。但是一直在散列中查找可能无法很好地扩展。类似于#1数字#3,如果你将它改为指向指针的指针,它会起作用。那么,如果我将指针指向指针,它会起作用吗?如果你不介意的话,告诉我你说的是什么。@pcunite,如果你(正确地)使用指针对指针,你可以将目标指针置零,并且可以检查*P==NULL。@stefan,当对指针调用delete时,它不知道谁在观察它,因此,稍后,当该内存地址再次被使用时,双指针会认为事情是好的。我需要一个对象,这就是弱ptr的真正含义,只是一个类观察另一个类。我想。。。
get(TMyType * pMyType)
{
    if(pMyType != NULL){ //do something }
}