【问题标题】:Access data in shared memory C++ POSIX访问共享内存中的数据 C++ POSIX
【发布时间】:2011-11-16 15:46:32
【问题描述】:

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

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

【问题讨论】:

  • 通过shmemgetCreateFileMapping 共享内存有利于进程间共享。您是否正在考虑这种进程间通信?
  • @minjang 是的。可能是因为我是内存管理新手,我倾向于将共享内存视为一个对象,并希望像访问对象一样访问其数据并对其执行操作。
  • @MaximYegorushkin 这非常具体和有帮助,值得回答!谢谢。

标签: c++ posix shared-memory


【解决方案1】:
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);

...或者,在您安排将address_of_my_shm1 传递给的其他线程/进程中 ...通过其他方式

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

您可能想要断言address_of_shm1 == address_of_shm2。但请注意,我说的是“可能”——您实际上不必这样做。某些类型/结构/类可以在不同的地址同样好地读取。

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

如果 shm 中的指针出现在同一地址,则它们是可用的。

相对指针可能非常有用,但同样,只要它们只指向 shm 内部。相对指针可能是相对于对象的基础的,即它们可能是偏移量。或者它们可能与指针本身有关。您可以定义一些不错的类/模板来进行这些计算,并在后台进行强制转换。

如果数据只是 POD(普通旧数据),则通过 shmem 共享对象是最简单的。没什么特别的。

因为你在不同的进程中,没有共享整个地址空间,你可能无法保证在使用 shm 共享内存段的所有进程中,虚拟函数之类的东西会出现在相同的地址。所以最好避免使用虚函数。 (如果你努力尝试和/或知道链接,在某些情况下你可能能够共享虚函数。但如果我必须调试,这是我首先会禁用的东西之一。)

只有在了解实现的对象内存模型时才应该这样做。如果高级(用于 C++)优化(例如将结构拆分为不连续的冷热部分)被禁用。由于这样的优化对于 C++ 来说可能是不合法的,所以你可能是安全的。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 2021-11-26
    • 2011-02-04
    • 2016-05-24
    • 2020-10-18
    • 2011-04-01
    • 2015-10-10
    相关资源
    最近更新 更多