gpt4 book ai didi

c++ - 访问共享内存中的数据 C++ POSIX

转载 作者:太空宇宙 更新时间:2023-11-04 14:20:15 25 4
gpt4 key购买 nike

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

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

最佳答案

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++ 来说可能是不合法的,因此您可能是安全的。

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

关于c++ - 访问共享内存中的数据 C++ POSIX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8154425/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com