boost :: interprocess :: shared_ptr threadsafe(和进程间安全)?

Jam*_*mes 6 c++ parallel-processing boost boost-interprocess

我想在线程之间共享数据,并在最后一个用户完成后自动删除它.这似乎在大多数情况下boost::interprocess::shared_ptr在一个boost::fixed_managed_shared_memory段中使用:但并非总是如此.

那么,是boost::interprocess::shared_ptr线程(和进程间) - 安全吗?

如果我在固定地址使用我的共享内存(我很确定这在我的64位(井,48位)地址空间中是可以的),是否可以使用普通boost::shared_ptr(这是线程安全)而不是?

一些澄清:

我使用的指针类型是plain void*,(我的共享内存映射到固定地址).

线程安全的问题是关于引用计数 - 即,是否允许同时复制/销毁在不同进程中同一事物的共享指针.不能访问不同线程中的相同共享指针,也不能访问指针.

Mic*_*urr 5

中使用的引用计数boost::interprocess:shared_ptr是使用 中定义的原子计数器boost/interprocess/detail/atomic.hpp实现的,引用计数逻辑主要由 实现boost/interprocess/smart_ptr/detail/sp_counted_base_atomic.hpp。目的是以线程(和进程间)安全的方式处理引用计数。

原子操作的实现取决于特定的目标平台(Windows 使用 Win32 Interlocked API,一些平台使用各种内联汇编等)。了解您的目标平台可能会有所帮助。我想您可能会在 refcount 处理中遇到错误,尽管我不会指望它。

我已将上述答案限制在您想要专门解决的领域:

线程安全的问题是关于引用计数——即,是否允许同时在不同进程中复制/销毁指向同一事物的共享指针。不同线程中不能访问同一个共享指针,也不能访问指针对象。

也就是说,我会查看可能由您上面提到的项目或以某种方式创建“独立”boost::interprocess:shared_ptr对象(其中不同的shared_ptrs 使用不同的引用计数引用同一对象)引入的错误。如果您有一些代码继续使用和/或传递原始对象指针,这种情况很容易发生。