共享内存中的STL结构

时间:2013-07-13 11:31:32

标签: c++ visual-c++ shared-memory

我需要在我的结构中创建一个类似于结构的队列,我将其用作共享内存。我怎样才能做到这一点 ?我的编译器是Visual C ++。

2 个答案:

答案 0 :(得分:3)

我担心在共享内存中使用复杂的C ++对象并不是那么简单。你必须考虑两件事。

1)

您需要在共享内存区域而不是堆栈中创建类实例。您可以使用placement new运算符来实现此目的。例如:

#include <new> // for placement new operator

class X
{
     // whatever
};

// suppose this points to some shared memory area
void *shared_mem = getSharedMem();

// this creates an instance of X at the start address of shared_mem
new(shared_mem) X;

// now you have a reference to an instance of X in the shared memory area
X& shared_x = *reinterpret_cast<X*>(shared_mem);

但是,请注意,只有一个进程负责在共享内存中构造该对象。此外,参与的其他进程需要一种方法来了解对象是否已经正确初始化并且可以安全地访问。 Access还需要某种进程间锁定(例如,在Win32上,一个名为mutex)

2)

如果您的类类型需要动态内存,就像使用队列数据结构一样,那么内存不能像往常一样来自堆,因为堆是一个进程的本地。如果您想使用STL队列容器,那么您可以实现自己的STL分配器类,该类不是从堆中获取内存,而是从共享内存中获取内存。

使用的allocator类是STL模板声明的一部分。例如std :: deque&lt; T,A&gt;其中A是分配器类型。默认情况下,使用标准STL分配器从堆中获取其内存。

然后,您的自定义共享内存分配器需要知道可以分配内存的共享内存地址。大多数STL实现中的分配器支持并不能很好地发挥分配器的每个实例数据(据我所知),因此您可能需要在分配器中使用一些全局/静态数据,以便它可以知道在哪里从中获取共享内存。

总而言之,您最好编写一个在共享内存上运行的简单自定义队列类,如1)中所述。您可以使队列类使用静态大小的内存,例如它可以为队列中的100个对象保留空间,如果超过此限制,则操作将失败。

答案 1 :(得分:0)

  1. 使用mutex保护共享内存,无论数据类型或类别如何。数据的复杂程度无关紧要。另请阅读有关how mutexes workwikipedia Threads文章的内容。您的共享数据必须位于堆中或作为全局变量,但不在堆栈上,即不是本地变量。
  2. 对于所有数据访问,您必须:
    • lock mutex
    • 将数据复制出来或写入数据(不要在这里花太多时间)
    • 发布互斥
    • 使用数据(如果已复制)
  3. 您是否想为线程和互斥体使用轻量级,开源,多平台C ++库?试试TinyThread++。它的许可证也适合商业用途,免费许可。它仅包含3个文件。请参阅有关如何使用它的文档。 C版本为TinyCThread