gpt4 book ai didi

c++ - 指针的多实例共享

转载 作者:太空宇宙 更新时间:2023-11-04 11:27:34 26 4
gpt4 key购买 nike

是否可以在彼此“不认识”的实例之间共享指针?

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

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

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

我想到的一个解决方案是在磁盘上使用“锁定文件”。一旦从文件中加载了一个 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) .内存映射文件基本上由操作系统控制,并且提供了一个允许在进程之间共享资源的接口(interface):

A memory-mapped file is a segment of virtual memory which has been assigned a direct byte-for-byte correlation with some portion of a file or file-like resource. This resource is typically a file that is physically present on-disk, but can also be a device, shared memory object, or other resource that the operating system can reference through a file descriptor. Once present, this correlation between the file and the memory space permits applications to treat the mapped portion as if it were primary memory.

关于c++ - 指针的多实例共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26091579/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com