指针的多实例共享

时间:2014-09-29 02:05:19

标签: c++ pointers instance

是否可以在不知道'的实例之间分享指针。彼此?

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

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

的数据进行交互

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

我想到的一个解决方案是使用'锁定文件'在磁盘上。只要从文件中加载一个DataBlock,就会锁定一个&#39}锁定文件。存储到磁盘。由于DataBlock已在另一个实例中加载,因此拒绝加载相同的DataBlock(基于标识符)。锁定文件'从内存中删除DataBlock后删除。

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

1 个答案:

答案 0 :(得分:1)

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

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

  

内存映射文件是已经存在的虚拟内存段   分配了与a的某些部分直接的逐字节相关   文件或类文件资源。此资源通常是一个文件   物理存在于磁盘上,但也可以是设备,共享内存   对象或操作系统可以引用的其他资源   通过文件描述符。一旦出现,这之间的相关性   文件和内存空间允许应用程序处理映射   部分好像是主存。