是否可以在互不认识的实例之间共享指针?
我有一个Messenger
类,该类分析字符串并执行用户发送的命令。解析后,它将new DataBlock
加载到内存(文件中的数据),在DataBlock
上执行命令,将DataBlock
存储到文件,然后删除DataBlock
指针。
我还有一个可视化类,以DataVisualization
实现。该可视化还使用了指向DataBlock
类的指针,但是将数据保留在内存中,直到用户关闭可视化为止。该程序还可以直接与DataBlock
的数据进行交互。
当Messenger
加载当前正在可视化的相同DataBlock
时,会出现问题。 Messenger
修改磁盘上的数据,但是DataBlock
中指向的DataVisualization
尚未更新。当尝试修改DataBlock
中的DataVisualization
的数据时,它将尝试修改磁盘上可能不再存在的数据。
我想到的一种解决方案是在磁盘上使用“锁定文件”。从文件中加载一个DataBlock
后,就会将“锁定文件”存储到磁盘中。拒绝加载相同的DataBlock
(基于标识符),因为DataBlock
已在另一个实例中加载。从内存中删除DataBlock
时,将删除“锁定文件”。
我很好奇如何改进它,有什么方法可以使Messenger
知道已经通过另一个实例可视化的DataBlock
,因此它使用该指针?如果我使用全局指针,则它只能在同一程序中运行,如何使用多个程序实例来管理它(假设可视化程序与消息传递程序是分开的)?在考虑必须处理大量实例和大量查询的数据库系统时,它们既无法将所有内容都保留在内存中,也无法“阻止”对数据库的访问。他们如何处理这个问题?
最佳答案
您不能在进程之间直接共享指针-每个进程都有自己的内存空间,并且一个进程的地址对于另一进程将无效/正确。
也许您正在尝试重新发明轮子:您应该查看Memory Mapped Files,Boost-Memory-Mapped Files (maybe it's part of the STL in C++11 - haven't checked now)。内存映射文件本质上是由OS控制的,并且提供了一个接口(interface),该接口(interface)允许在进程之间共享资源: