C++ 共享内存中的STL结构

C++ 共享内存中的STL结构,c++,visual-c++,shared-memory,C++,Visual C++,Shared Memory,我需要在我的结构中创建一个类似队列的结构,并将其用作共享内存。我该怎么做?我的编译器是Visual C++。,在共享内存中使用复杂的C++对象不是那么简单。你必须考虑两件事: (一) 您需要在共享内存区域而不是堆栈上创建类实例。您可以通过使用“放置新”操作符来实现这一点。例如: #include <new> // for placement new operator class X { // whatever }; // suppose this points to s

我需要在我的结构中创建一个类似队列的结构,并将其用作共享内存。我该怎么做?我的编译器是Visual C++。

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

(一)

您需要在共享内存区域而不是堆栈上创建类实例。您可以通过使用“放置新”操作符来实现这一点。例如:

#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);
#包含//用于放置新运算符
X类
{
//随便
};
//假设这指向某个共享内存区域
void*shared_mem=getSharedMem();
//这将在shared_mem的起始地址创建一个X实例
新(共享成员)X;
//现在您有了对共享内存区域中X实例的引用
X&shared\u X=*重新解释演员阵容(shared\u mem);
但是,请注意,只有一个进程负责在共享内存中构造该对象。另外,参与的其他进程需要一种方法来知道对象是否已经正确初始化并且可以安全访问。访问还需要某种进程间锁定(例如,在Win32上,命名互斥锁)

(二)

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

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

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


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

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

(一)

您需要在共享内存区域而不是堆栈上创建类实例。您可以通过使用“放置新”操作符来实现这一点。例如:

#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);
#包含//用于放置新运算符
X类
{
//随便
};
//假设这指向某个共享内存区域
void*shared_mem=getSharedMem();
//这将在shared_mem的起始地址创建一个X实例
新(共享成员)X;
//现在您有了对共享内存区域中X实例的引用
X&shared\u X=*重新解释演员阵容(shared\u mem);
但是,请注意,只有一个进程负责在共享内存中构造该对象。另外,参与的其他进程需要一种方法来知道对象是否已经正确初始化并且可以安全访问。访问还需要某种进程间锁定(例如,在Win32上,命名互斥锁)

(二)

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

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

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

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

  • 使用保护共享内存,无论它是什么数据类型或类。数据有多复杂并不重要。也请阅读本文和文章。共享数据必须在堆中或作为全局变量,但不能在堆栈上,即不能是局部变量
  • 对于所有数据访问,您必须:
    • 锁互斥
    • 将数据复制或写入数据(不要在此处花费太多时间)
    • 释放互斥
    • 使用数据(如果已复制)
  • <>你想使用一个轻量级的、开源的、多平台的C++库来支持线程和互斥吗?尝试其许可证也适用于商业用途,是自由许可的。它只包含3个文件。请参阅有关如何使用它的文档。C版本是
  • 使用保护共享内存,无论它是什么数据类型或类。数据有多复杂并不重要。也请阅读本文和文章。共享数据必须在堆中或作为全局变量,但不能在堆栈上,即不能是局部变量
  • 对于所有数据访问,您必须:
    • 锁互斥
    • 将数据复制或写入数据(不要在此处花费太多时间)
    • 释放互斥
    • 使用数据(如果需要)