【问题标题】:Multi-instance sharing of pointers多实例共享指针
【发布时间】:2014-09-29 02:05:19
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 没有任何代码的废话太多。
  • 没有完美的解决方案,但您可以 (1) 努力让用户了解情况,例如您看到的这些数据是什么时候获取的,以及 (2) 确保存储的数据是自洽的(其中可以包括锁定以进行修改)。您可能会考虑一些视图通知机制。例如。他们可能会订阅通知。
  • 那么你的意思是你有两个持久的对象,它们将它们的状态存储在磁盘上并且你试图同时使用它们?
  • 如果是这样,您可以 (a) 使用您所描述的锁定; (b) 创建一个管理器来管理这些对象。加载和保存对象的唯一方法是通过Manager,Manager会处理传入的对象请求并同步对象状态的写入。
  • 太宽泛,选项/问题太多。例如。你的数据块是固定大小的吗?您如何在磁盘上“删除”它们(例如,在记录上写一个哨兵/在已删除的数据块上移动同一文件中的后续数据块/删除特定于数据块的文件)?您是否有空闲列表或索引要在磁盘上维护?当数据块被修改时你想要回调,还是轮询更新?你能承受多长时间的线程阻塞?等等。如果您是新手,只需拿起一个数据库库并专注于您的应用程序代码。

标签: c++ pointers instance


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    相关资源
    最近更新 更多