我必须在多线程应用程序中共享一个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事情都不熟悉,而且文档现在对我来说有点混乱,所以请原谅我这是一个愚蠢的问题。
如果有人能告诉我是否值得调查此选项,或者是否存在多个陷阱并且某些旧学校方法更好,我将不胜感激?
答案 0 :(得分:1)
weak_ptr
通常用于打破相互依赖的数据结构中的循环。
我相信你提供的描述会有效。一旦weak_ptr::lock
成功,您就会很好,直到您让退回的shared_ptr
超出范围。
我不明白为什么你不只是给自己的UI线程shared_ptr
。然后,您不必担心工作线程中的shared_ptr
消失并使用它获取BLOB访问权限。像这样的数据共享恰恰是shared_ptr
的理想选择。