共享内存中的STL容器(Windows)

3
我正在开发一个应用程序,由2个进程组成,它们必须共享一些数据结构。这些类组织在不同的库中,这些库在不同的应用程序中使用。
  • 我的第一次尝试是在Win32中使用命名共享内存,但问题在于我不能使用STL容器。
  • 寻找解决方案,我发现了Boost Interprocess,如果我理解正确,我必须将我的类中的所有STL容器更改为“STL” Boost Interprocess容器。

那么,在Windows中是否有其他方法可以使用STL共享类或结构?目标是在我们的库中不要创建太多对Boost的依赖。

谢谢


1
您需要为容器创建一个自定义的分配器。请参考此网站了解更多相关信息。 - Some programmer dude
3个回答

7
Boost.Interprocess有自己的容器类的原因是,大多数当前的实现在分配器方面并不完全支持标准。
Boost.Interprocess容器类是标准容器的完全兼容实现,因此您可以将它们用作标准容器的替代品,并在厂商提供的容器支持标准分配器协议后切换到它们。
我不确定是否比文档更好地解释了它,但最大的问题是,在不同的虚拟地址处将共享内存映射到不同的进程中,因此容器中使用的任何指针都必须是相对指针(例如从段的开头)。标准分配器模型支持此功能,但容器也必须通过使用Allocator::pointer而不是T *来支持此功能。当所有实现都被修复以支持此功能时,Boost.Interprocess容器将不再必需。
或者,您可能能够在每个进程中将内存映射到相同的虚拟地址;如果这样做,则可以使用现有实现的容器,因为原始指针将正常工作。

1
使用符合标准的STL集合与boost::interprocess一起使用的真正问题在于,标准明确允许集合假定相同类型的分配器是等效的,分配器不需要任何存储状态,并且可以忽略指针类型并使用T*。
boost::interprocess文档比我更好地解释了这一点,但我的总结如下:
  • C++标准允许无状态或有状态分配器
  • C++标准允许即使分配器指定另一种类型,也可以使用T*作为指针
  • boost::interprocess要求有状态分配器支持(以便所有分配中都可以使用所拥有的内存段)
  • 对于大多数用途,boost::interprocess使用替代指针类型 - 对于非平凡应用程序,这将是offset_ptr
  • boost::interprocess集合 - map/vector等 - (这些当前是boost::container类型的typedef)提供了boost::interprocess要求的所有这些可选实现细节

因此,即使您当前的STL集合支持boost::interprocess的要求(实际上可能不支持),C++标准也没有提供它们将来会继续提供这些要求的保证。在boost::interprocess应用程序中使用的集合的唯一明智方法是使用保证符合boost:interprocess要求的boost集合 - 来自boost::container或boost:interprocess:collections。


1

个人而言,我会避免使用共享结构的方法。另一种选择是将结构的所有权交给其中一个进程,另一个进程通过向第一个进程发送消息来访问它。

如果您绝对要使用共享内存,则可以在STL中使用它。首先,您需要为容器创建自定义分配器。分配器将从共享内存块中分配内存。此外,由于STL容器不是线程安全的,因此您需要编写一个使用命名互斥锁的同步包装器来保护容器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接