2011-11-16 60 views
1

我打开一段共享内存并获取它的句柄。我知道有几个向量存储在内存中的数据。我想访问这些数据向量并对它们执行一些操作。我怎样才能做到这一点?将共享内存视为对象是否合适,以便我们可以将这些向量定义为对象的字段,并将那些需要的操作定义为对象的成员函数?访问共享内存中的数据C++ POSIX

我从来没有处理过共享内存。更糟的是,我是C++和POSIX的新手。有人可以提供一些指导吗?简单的例子将不胜感激。

+0

通过'shmemget'或'CreateFileMapping'的共享内存适用于进程之间的共享。你在考虑这个进程间通信吗? – minjang

+0

@minjang是的。可能因为我是内存管理新手,我觉得倾向于将共享内存视为对象,并希望访问其数据并对其执行操作,就像我们将对象一样。 –

+2

看看提升。[在共享内存中创建矢量](http://www.boost.org/doc/libs/1_48_0/doc/html/interprocess/quick_guide.html#interprocess.quick_guide.qg_interprocess_container) –

回答

0
int my_shmid = shmget(key,size,shmflgs); 
... 
void* address_of_my_shm1 = shat(my_shmid,0,shmflags); 

Object* optr = static_cast<Object*>(address_of_my_shm1); 

...或者,在一些其他线程/进程,你安排一些其他方法

void* address_of_my_shm2 = shat(my_shmid,address_of_my_shm1,shmflags); 

您可能想要断定address_of_shm1 == address_of_shm2传递address_of_my_shm1 ...。但请注意,我说“可能” - 你实际上并不需要这样做。某些类型/结构体/类可以在不同的地址同等阅读。

如果对象出现在不同的地址空间中,那么在进程A中shhm之外的指针可能不会指向与进程B中相同的东西。通常,shm之外的指针是不好的。 (虚拟函数是指向对象之外的指针,除了shm外,坏,除非您有其他理由相信它们。)

如果shm内的指针出现在相同的地址处,则它们可用。

相对指针可能相当有用,但是,只要它们只指向shm内部即可。相对指针可以相对于对象的基础,即它们可以是偏移量。或者它们可能与指针本身有关。你可以定义一些很好的类/模板来完成这些计算,并在后台进行投射。通过SHMEM对象

共享是最简单的,如果数据只是POD(普通旧数据)。没有什么花哨。

因为你是指在没有被共享整个地址空间不同的过程,则可能不能保证的事情等虚函数将出现在使用SHM共享存储器段的所有进程相同的地址。所以最好避免虚拟功能。 (如果您努力尝试和/或知道链接,您可能在某些情况下可以共享虚拟功能,但这是我必须禁用的第一件事情之一,如果我必须调试。)

您应该只做这个如果你知道你的实现的对象内存模型。如果先进的(对于C++)优化,比如将结构拆分成不连续的热部分和冷部分,则会被禁用。由于这种优化可能对C++来说不合法,因此您可能是安全的。

很显然,如果您在所有方面都转换为相同的对象类型/类,那么效果会更好。 你可以逃脱非虚拟功能。然而,请注意,拥有相同的类可能相当容易,但是类的不同版本 - 例如大小不同,例如添加一个新字段并更改所有其他字段的偏移量 - 所以您需要非常小心以确保所有方都使用相同的定义和声明。