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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.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
Multithreading 多线程应用程序共享ptr中的共享资源管理?_Multithreading_C++11_Shared Ptr - Fatal编程技术网

Multithreading 多线程应用程序共享ptr中的共享资源管理?

Multithreading 多线程应用程序共享ptr中的共享资源管理?,multithreading,c++11,shared-ptr,Multithreading,C++11,Shared Ptr,我必须在一个多线程应用程序中共享一个BLOB,我目前正在研究shared_ptr/weak_ptr方法,但我不确定它是否正确 有一个工作线程创建资源类(new CResource)。CResource可能相当大,因此我希望避免额外的副本 然后还有另一个UI线程,我想用指向CResource的指针发布PostMessage 但是工作线程可以比UI线程更快地退出,反之亦然。工人无法知道消息是否已被处理 因此,我想知道我是否可以在工作线程中创建一个(新的共享\u ptr),然后将一个(新的弱\u pt

我必须在一个多线程应用程序中共享一个BLOB,我目前正在研究shared_ptr/weak_ptr方法,但我不确定它是否正确

有一个工作线程创建资源类(new CResource)。CResource可能相当大,因此我希望避免额外的副本

然后还有另一个UI线程,我想用指向CResource的指针发布PostMessage

但是工作线程可以比UI线程更快地退出,反之亦然。工人无法知道消息是否已被处理

因此,我想知道我是否可以在工作线程中创建一个(新的共享\u ptr),然后将一个(新的弱\u ptr)传递给postmessage函数,以及它是否能够进行自动清理。因此,如果工作线程破坏它的共享_ptr,UI线程将在弱_ptr.lock上返回false,因此不需要额外的同步和资源管理

另外,如果工作者创建一个新的CResource,UI线程开始运行,工作者调用shared_ptr.reset(new CResource),会发生什么情况?如果不进行锁定,UI线程似乎可以在此时开始读取已删除的数据

或者,如果主线程退出,并在清理过程中删除它的共享\u ptr,那么弱的\u ptr会挂起吗

我对所有这些共享/弱ptr的东西都有点陌生,文档对我来说现在有点混乱,所以如果这是一个愚蠢的问题,请原谅


如果有人能告诉我这个选项是否值得研究,或者是否存在多个陷阱,一些老式方法更好,我将不胜感激。

弱ptr
通常用于打破相互依赖的数据结构中的循环

从你提供的描述来看,我相信这会奏效。一旦
weak_ptr::lock
成功,您将一直保持良好状态,直到返回的
shared_ptr
超出范围


我不明白为什么你不给UI线程一个自己的
shared\u ptr
。这样,您就不必担心工作线程中的
共享\u ptr
会消失,并带走您的BLOB访问权限。像这样的数据共享正是
shared\u ptr
最理想的功能。

如果主线程已经执行完,那么指针几乎已经过期,那么跳过更新就可以了。问题是,弱的\u ptr将如何知道不再有共享的\u ptr,因为它已被删除,并带有所有的refcounted数据。我找不到任何关于弱线程安全性的可靠信息。我越想它,重置场景也就越混乱。基本上,两个线程都有一个共享的ptr连接到资源a,线程a.get()的原始指针并缓存它以供本地访问,线程B.reset()是共享的ptr,线程a读取.get()的ted指针-0x8000005?@Madman-是的,如果像这样使用
共享的ptr
,它会出错。如果两个线程都使用一个
共享的\u ptr
,那么您应该做什么,其中每个线程在完成时都让它超出范围。创建一个全新的
shared_ptr
来保存每个工作项-不要在单个全局
shared_ptr
中使用
reset()
。实际上,从我的实验来看,reset()工作得很好。如果有多个指向对象的共享\u指针,则创建一个弱\u ptr,然后重置其中一个共享\u ptr引用,弱\u ptr和其他共享\u ptr仍将指向原始对象,但重置的指针将指向新对象。若您只有一个共享的\u ptr引用,那个么弱\u ptr一旦离开作用域或被删除就会失效。比我想象的还要好。尽管找不到有关此行为的文档。如果你在作用域中有一个共享的\u ptr,get()也是完全安全的。@Madman-我不知道它是这样工作的,谢谢你的后续信息。我想你可以把这个作为一个答案,并通过接受它来表扬自己:-)