【发布时间】:2019-09-16 12:01:58
【问题描述】:
我有多个用 C++17 编写的程序,在 Linux 上运行。
一个程序在 /dev/shm/ 下创建一个文件并将其映射到它的内存空间。然后它继续使用placement-new在共享内存中初始化一个POD对象。
其他进程将打开这些文件并将其映射到它们的内存空间以访问该对象。目前,我正在使用 C 风格的强制转换,它有效,但我相信根据 C++ 别名规则,它在技术上是未定义的行为,因此这可能会在未来版本的 GCC 中中断。
编译器不知道该内存位置存在对象。通常,我会通过调用placement-new 将这一点传达给编译器,但在这种情况下,这将初始化现有对象(我相信这也是未定义的行为)。
我应该如何在不违反严格的别名规则的情况下访问该对象? 这是std::launder 的用例吗?
【问题讨论】:
-
新放置不会初始化 POD。但是,您应该采取特殊措施来防止诸如互斥锁之类的竞争条件。这在很大程度上取决于您的设计。
标签: c++ ipc c++17 shared-memory interprocess