【发布时间】:2014-09-29 02:05:19
【问题描述】:
是否可以在彼此不“认识”的实例之间共享指针?
我有一个Messenger 类,它解析字符串并执行用户发送的命令。解析后,将new DataBlock加载到内存(来自文件的数据),在DataBlock上执行命令,将DataBlock存储到文件中,然后删除DataBlock指针。
我还有一个可视化类,在DataVisualization 中实现。此可视化还使用指向DataBlock 类的指针,但将数据保留在内存中,直到用户关闭可视化。程序还可以直接与DataBlock的数据进行交互。
当Messenger 加载与当前可视化相同的DataBlock 时会出现问题。 Messenger 修改了磁盘上的数据,但DataVisualization 中指向的DataBlock 尚未更新。当尝试修改DataVisualization中DataBlock的数据时,它会尝试修改磁盘上可能不再存在的数据。
我想到的一个解决方案是在磁盘上使用“锁定文件”。一旦从文件中加载了一个DataBlock,就会将一个“锁定文件”存储到磁盘中。由于 DataBlock 已在另一个实例中加载,因此拒绝任何加载相同的 DataBlock(基于标识符)。当DataBlock 从内存中删除时,“锁定文件”将被删除。
我很好奇如何改进这一点,有哪些方法可以使Messenger 知道已经通过另一个实例可视化的DataBlock,所以它使用该指针?如果我使用全局指针,它只能在同一个程序中工作,我如何使用多个程序实例来管理它(假设可视化程序与消息传递程序是分开的)?在考虑必须处理大量实例和大量查询的数据库系统时,它们既不能将所有内容都保存在内存中,也不能“阻止”对数据库的访问。他们如何处理这个问题?
【问题讨论】:
-
没有任何代码的废话太多。
-
没有完美的解决方案,但您可以 (1) 努力让用户了解情况,例如您看到的这些数据是什么时候获取的,以及 (2) 确保存储的数据是自洽的(其中可以包括锁定以进行修改)。您可能会考虑一些视图通知机制。例如。他们可能会订阅通知。
-
那么你的意思是你有两个持久的对象,它们将它们的状态存储在磁盘上并且你试图同时使用它们?
-
如果是这样,您可以 (a) 使用您所描述的锁定; (b) 创建一个管理器来管理这些对象。加载和保存对象的唯一方法是通过Manager,Manager会处理传入的对象请求并同步对象状态的写入。
-
太宽泛,选项/问题太多。例如。你的数据块是固定大小的吗?您如何在磁盘上“删除”它们(例如,在记录上写一个哨兵/在已删除的数据块上移动同一文件中的后续数据块/删除特定于数据块的文件)?您是否有空闲列表或索引要在磁盘上维护?当数据块被修改时你想要回调,还是轮询更新?你能承受多长时间的线程阻塞?等等。如果您是新手,只需拿起一个数据库库并专注于您的应用程序代码。