【发布时间】:2011-03-20 00:35:11
【问题描述】:
我想在线程之间共享数据,并在最后一个用户完成后自动删除它。在大多数情况下,这似乎有效,在 boost::fixed_managed_shared_memory 段中使用 boost::interprocess::shared_ptr:但并非总是如此。
那么,boost::interprocess::shared_ptr 线程(和进程间)安全吗?
如果我在一个固定地址使用我的共享内存(我很确定这在我的 64 位(嗯,48 位)地址空间中是可以的),是否可以使用普通的boost::shared_ptr(它们是线程安全的)?
一些澄清:
我使用的指针类型是普通的void*,(我的共享内存映射到一个固定地址)。
线程安全问题与引用计数有关——即,是否允许同时在不同进程中复制/销毁指向同一事物的共享指针。 不访问不同线程中的同一个共享指针,并且不访问被指针对象。
【问题讨论】:
-
我不知道细节,但如果 boost::interprocess::shared_ptr 不是进程间安全的,这似乎是相当矛盾的。他们为什么要把它放在那里?
-
因为它可以放在 共享内存中,而
boost::shared_ptr不能(因为它使用虚拟继承等)。 -
仍然,这意味着您需要手动同步该
shared_ptr的生命周期结束?这完全违反了 RAII,所以它们当然应该和通常的 shared_ptr 一样是线程安全的。 -
是的,我希望它是。我真的希望有人确认它是安全的(最好有一些证据),所以我可以将我的崩溃归咎于我的代码......
-
请参阅下面的评论 - 您需要澄清您是否正在从多个线程或进程访问特定的 shared_ptr 实例(谈论指针本身,而不是指向的对象)。这不安全。
标签: c++ boost parallel-processing boost-interprocess