是否可以在互不认识的实例之间共享指针?

我有一个Messenger类,该类分析字符串并执行用户发送的命令。解析后,它将new DataBlock加载到内存(文件中的数据),在DataBlock上执行命令,将DataBlock存储到文件,然后删除DataBlock指针。

我还有一个可视化类,以DataVisualization实现。该可视化还使用了指向DataBlock类的指针,但是将数据保留在内存中,直到用户关闭可视化为止。该程序还可以直接与DataBlock的数据进行交互。

Messenger加载当前正在可视化的相同DataBlock时,会出现问题。 Messenger修改磁盘上的数据,但是DataBlock中指向的DataVisualization尚未更新。当尝试修改DataBlock中的DataVisualization的数据时,它将尝试修改磁盘上可能不再存在的数据。

我想到的一种解决方案是在磁盘上使用“锁定文件”。从文件中加载一个DataBlock后,就会将“锁定文件”存储到磁盘中。拒绝加载相同的DataBlock(基于标识符),因为DataBlock已在另一个实例中加载。从内存中删除DataBlock时,将删除“锁定文件”。

我很好奇如何改进它,有什么方法可以使Messenger知道已经通过另一个实例可视化的DataBlock,因此它使用该指针?如果我使用全局指针,则它只能在同一程序中运行,如何使用多个程序实例来管理它(假设可视化程序与消息传递程序是分开的)?在考虑必须处理大量实例和大量查询的数据库系统时,它们既无法将所有内容都保留在内存中,也无法“阻止”对数据库的访问。他们如何处理这个问题?

最佳答案

您不能在进程之间直接共享指针-每个进程都有自己的内存空间,并且一个进程的地址对于另一进程将无效/正确。

也许您正在尝试重新发明轮子:您应该查看Memory Mapped FilesBoost-Memory-Mapped Files (maybe it's part of the STL in C++11 - haven't checked now)。内存映射文件本质上是由OS控制的,并且提供了一个接口(interface),该接口(interface)允许在进程之间共享资源:

07-27 13:20