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

时间:2012-09-18 13:08:08

标签: c++ winapi stl boost-interprocess

我正在开发一个由2个进程组成的应用程序,这些进程必须共享一些数据结构。这些类组织在不同的库中,库用于不同的应用程序。

  • 我的第一次尝试是在Win32中使用Named Shared Memory,但问题是我无法使用STL容器。
  • 寻找解决方案,我找到Boost Interprocess,如果我理解,我必须将我的类中的所有STL容器更改为“STL”Boost Interprocess容器。

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

由于

3 个答案:

答案 0 :(得分:7)

Boost.Interprocess有自己的容器类的原因是大多数当前的实现并不完全支持分配器的标准。

Boost.Interprocess容器类是标准容器的完全兼容的实现,因此您可以将它们用作标准容器的直接替换,并在修复它们时切换到供应商提供的容器以支持标准分配器协议

我不确定我是否能比documentation更好地解释它,但最大的问题是共享内存映射到不同虚拟地址的不同进程,因此容器中使用的任何指针必须相对指针(例如,从段的开头)。标准分配器模型支持此功能,但容器也必须使用Allocator::pointer而不是T *来支持此功能。修复所有实现以支持此功能后,将不再需要Boost.Interprocess容器。

或者,您可以能够映射内存at the same virtual address in each process;如果你这样做,那么你可以使用你现有的实现容器,因为原始指针将正常工作。

答案 1 :(得分:1)

就个人而言,我会避免使用共享结构方法。另一种方法是将结构的所有权赋予两个过程之一。另一个进程将通过向第一个进程发送消息来访问它。

如果您完全使用共享内存,那么您当然可以将它与STL一起使用。首先,您必须为容器创建自定义分配器。分配器将从共享内存块分配内存。此外,由于STL容器不是线程安全的,因此您必须使用命名的互斥锁为容器编写同步包装器。

答案 2 :(得分:1)

使用符合标准的STL集合和boost :: interprocess的真正问题是标准明确允许集合假设相同类型的分配器是等效的,分配器不需要任何存储状态,并且可以忽略指针类型,也可以使用T *。

boost :: interprocess文档比我更好地解释了这一点,但我的总结是:

  • C ++标准允许无状态或有状态分配器
  • 即使分配器指定了另一种类型
  • ,C ++标准也允许使用T *作为指针
  • boost :: interprocess需要有状态分配器支持(因此拥有的内存段可以在所有分配中使用)
  • 对于大多数用途,boost :: interprocess使用替代指针类型 - 对于非平凡的应用程序,这将是offset_ptr
  • boost :: interprocess collections - map / vector / etc - (这些当前是boost :: container类型的typedef)提供了boost :: interprocess requires
  • 的所有这些可选实现细节。

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