是否可以在不知道'的实例之间分享指针。彼此?
我有一个Messenger
类,它解析字符串并执行用户发送的命令。解析后,它将new DataBlock
加载到内存(来自文件的数据),在DataBlock
上执行命令,将DataBlock
存储到文件,然后删除DataBlock
指针。
我还有一个可视化类,在DataVisualization
中实现。此可视化还使用指向DataBlock
类的指针,但将数据保留在内存中,直到用户关闭可视化。该程序还可以直接与DataBlock
。
当Messenger
加载当前可视化的DataBlock
时出现问题。 Messenger
修改了磁盘上的数据,但DataBlock
中指向的DataVisualization
尚未更新。尝试修改DataBlock
中DataVisualization
的数据时,它会尝试修改可能不再存在的磁盘上的数据。
我想到的一个解决方案是使用'锁定文件'在磁盘上。只要从文件中加载一个DataBlock
,就会锁定一个&#39}锁定文件。存储到磁盘。由于DataBlock
已在另一个实例中加载,因此拒绝加载相同的DataBlock
(基于标识符)。锁定文件'从内存中删除DataBlock
后删除。
我很好奇如何改进这一点,有哪些方法可以让Messenger
知道已经通过另一个实例可视化的DataBlock
,所以它使用了那个指针?如果我使用全局指针,它只能在同一个程序中运行,我如何使用多个程序实例来管理它(让我们说可视化程序与消息传递程序是分开的)?在考虑必须处理大量实例和大量查询的数据库系统时,他们无法将所有内容保存在内存中或“阻止”内容。访问数据库。他们如何处理这个问题?
答案 0 :(得分:1)
您不能直接在进程之间共享指针 - 每个进程都有自己的内存空间,而一个进程的地址对另一个进程无效/正确。
也许你正试图重新发明轮子:你应该看Memory Mapped Files,Boost-Memory-Mapped Files (maybe it's part of the STL in C++11 - haven't checked now)。内存映射文件基本上由操作系统控制,并提供了一个允许在进程之间共享资源的接口:
内存映射文件是已经存在的虚拟内存段 分配了与a的某些部分直接的逐字节相关 文件或类文件资源。此资源通常是一个文件 物理存在于磁盘上,但也可以是设备,共享内存 对象或操作系统可以引用的其他资源 通过文件描述符。一旦出现,这之间的相关性 文件和内存空间允许应用程序处理映射 部分好像是主存。