c++ - 在不违反严格的别名规则的情况下访问进程间共享内存中的对象

标签 c++ ipc c++17 shared-memory interprocess

我有多个用 C++17 编写的程序,在 Linux 上运行。

一个程序在/dev/shm/下创建一个文件并将其映射到它的内存空间。然后它继续使用 placement-new 来初始化共享内存中的 POD 对象。

其他进程将打开并将这些文件映射到它们的内存空间以访问该对象。目前,我使用的是 C 风格的强制转换,它可以工作,但我相信根据 C++ 别名规则,这在技术上是未定义的行为,因此这可能会在 GCC 的 future 版本中中断。

编译器不知道该内存位置存在一个对象。通常,我会通过调用 placement-new 将其传达给编译器,但在这种情况下会初始化现有对象(我认为这也是未定义的行为)。

我应该如何在不违反严格的别名规则的情况下访问这个对象? 这是 std::launder 的用例吗? ?

最佳答案

mmap 函数返回一个 void 指针,严格的类型别名规则不适用于 void 指针,因为它们不指向实际类型,但需要在访问之前转换为某些内容。因此,在 C++ 中,对 void 指针使用类似 C 的强制转换或更好的 static_cast 是完全合法的。

但是如果您访问共享内存中的数据,它可能会成为一个优化问题。如果编译器可以看到所有调用,则允许您的编译器假定 RAM 没有被某些东西改变。因此,您必须在它周围放置例如互斥锁,以确保您的编译器无法看到所有可能的访问并且必须重新加载数据。

关于c++ - 在不违反严格的别名规则的情况下访问进程间共享内存中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55876649/

相关文章:

c++ - 如何在C++ 11中的类中声明n个字符串的 vector

c++ - dlopen、工厂模式和虚方法表

c# - 如何在不写入磁盘的情况下将 XML 从 Delphi 传递到 C#?

带守护进程的 Linux IPC 多客户端

c++ - 是否可以检查类型是否已使用特定模板参数实例化?

c++ - 在 C++ 和 C 之间传递数据

c++ - 如何在不缓冲接收数据包的情况下在 Linux 中创建原始套接字?是否可以?

c - 从 `forkpty` 子进程读取 : `ls/` output yields `EIO`

c++ - 为什么他们坚持在下面的示例中使用 `extern` 说明符?

c++ - 每当使用 constexpr 指定调用的函数时,将委托(delegate)方法声明为 constexpr