我想在线程之间共享数据,并在最后一个用户使用完数据后自动删除数据。大多数时候,这似乎有效,使用boost::interprocess::shared_ptr
in a boost::fixed_managed_shared_memory
段:但并非总是如此。
So, is boost::interprocess::shared_ptr
线程(和进程间)安全吗?
如果我在固定地址使用共享内存(我非常确定这在我的 64 位(好吧,48 位)地址空间中没问题),是否可以使用普通的内存boost::shared_ptr
(哪些是线程安全的)?
一些澄清:
我使用的指针类型是普通的void*
,(我的共享内存被映射到固定地址)。
线程安全的问题与引用计数有关——即是否允许同时在不同进程中复制/销毁指向同一事物的共享指针。Not在不同线程中访问同一共享指针,以及not访问受指点者。
使用的引用计数boost::interprocess:shared_ptr
是使用定义在中的原子计数器实现的boost/interprocess/detail/atomic.hpp
引用计数逻辑主要由boost/interprocess/smart_ptr/detail/sp_counted_base_atomic.hpp
。目的是以线程(和进程间)安全的方式处理引用计数。
原子操作的实现因特定的目标平台而异(Windows 使用 Win32 Interlocked API,某些平台使用各种内联汇编等)。了解您的目标平台可能会有所帮助。我想您可能会在引用计数处理中遇到错误,尽管我不会指望它。
我将上述答案限制在您想要特别解决的领域:
线程安全的问题与引用计数有关——即是否允许同时在不同进程中复制/销毁指向同一事物的共享指针。不同线程中不能访问同一个共享指针,也不能访问被指针。
也就是说,我会看看您上面提到的项目或以某种方式创建“独立”可能引入的错误boost::interprocess:shared_ptr
对象(其中不同shared_ptr
s 使用不同的引用计数引用同一个对象)。如果您有一些代码继续使用和/或传递原始对象指针,则很容易发生这种情况。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)