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

时间:2010-10-11 15:09:16

标签: multithreading c++11 shared-ptr

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

有一个工作线程可以创建资源类(新CResource)。 CResource可能非常大,所以我想避免额外的副本。

然后还有另一个UI线程,我希望PostMessage带有指向CResource的指针。

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

所以我想知道我是否可以在工作线程中创建一个(new shared_ptr),然后将一个(new weak_ptr)传递给postmessage函数,如果它需要自动清理。因此,如果工作线程破坏了它的shared_ptr,那么UI线程将在weak_ptr.lock上返回false,因此不需要额外的同步和资源管理。

如果worker创建一个新的CResource,UI线程开始运行,worker调用shared_ptr.reset(new CResource)会发生什么?如果没有锁定,UI线程似乎可以在此时开始读取已删除的数据?

或者如果主线程退出,并在清理过程中删除它的shared_ptr,那么weak_ptr将会悬空吗?

我对所有这些共享/ weak_ptr事情都不熟悉,而且文档现在对我来说有点混乱,所以请原谅我这是一个愚蠢的问题。

如果有人能告诉我是否值得调查此选项,或者是否存在多个陷阱并且某些旧学校方法更好,我将不胜感激?

1 个答案:

答案 0 :(得分:1)

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

我相信你提供的描述会有效。一旦weak_ptr::lock成功,您就会很好,直到您让退回的shared_ptr超出范围。

我不明白为什么你不只是给自己的UI线程shared_ptr。然后,您不必担心工作线程中的shared_ptr消失并使用它获取BLOB访问权限。像这样的数据共享恰恰是shared_ptr的理想选择。