C++ 指针的多实例共享
是否可以在互不“了解”的实例之间共享指针 我有一个C++ 指针的多实例共享,c++,pointers,instance,C++,Pointers,Instance,是否可以在互不“了解”的实例之间共享指针 我有一个Messenger类,它解析字符串并执行用户发送的命令。解析后,它将新数据块加载到内存(文件中的数据),在数据块上执行命令,将数据块存储到文件,然后删除数据块指针 我还有一个可视化类,在DataVisualization中实现。此可视化还使用指向DataBlock类的指针,但将数据保留在内存中,直到用户关闭可视化。该程序还可以直接与数据块的数据交互 当Messenger加载当前显示的相同DataBlock时,会出现问题。Messenger修改磁盘
Messenger
类,它解析字符串并执行用户发送的命令。解析后,它将新数据块
加载到内存(文件中的数据),在数据块
上执行命令,将数据块
存储到文件,然后删除数据块
指针
我还有一个可视化类,在DataVisualization
中实现。此可视化还使用指向DataBlock
类的指针,但将数据保留在内存中,直到用户关闭可视化。该程序还可以直接与数据块的数据交互
当Messenger
加载当前显示的相同DataBlock
时,会出现问题。Messenger
修改磁盘上的数据,但在DataVisualization
中指向的DataBlock
尚未更新。当试图修改数据可视化
中数据块
的数据时,它试图修改磁盘上可能不再存在的数据
我想到的一个解决方案是在磁盘上使用“锁定文件”。一旦从文件中加载了一个数据块
,一个“锁定文件”就会存储到磁盘中。相同的数据块
(基于标识符)的任何加载都将被拒绝,因为数据块
已在另一个实例中加载。从内存中删除数据块
时,“锁定文件”将被删除
我很想知道如何改进这一点,有什么方法可以让Messenger
知道已通过另一个实例可视化的数据块
,因此它使用该指针?如果我使用全局指针,它只在同一个程序中工作,我如何使用多个程序实例来管理它(假设可视化程序与消息传递程序是分开的)?考虑到数据库系统必须处理大量实例和大量查询,它们既不能将所有内容都保存在内存中,也不能“阻止”对数据库的访问。他们如何处理这个问题?您不能在进程之间直接共享指针-每个进程都有自己的内存空间,并且一个进程的地址对另一个进程无效/不正确
也许你正试图重新发明轮子:你应该看看。内存映射文件基本上由操作系统控制,并提供了一个接口,允许在进程之间共享资源:
内存映射文件是一段虚拟内存,它已被
分配了一个直接的字节对字节关联,与
文件或类似文件的资源。此资源通常是一个
物理上存在于磁盘上,但也可以是设备、共享内存
对象或操作系统可以引用的其他资源
通过文件描述符。一旦出现,这种相关性
文件和内存空间允许应用程序处理映射的
部分,就好像它是主内存一样
没有任何代码的话太多了。没有完美的解决方案,但您可以(1)努力通知用户,例如,您看到的这些数据是何时提取的,以及(2)确保存储的数据是自一致的(可以包括修改锁定)。您可以考虑一些视图的通知机制。例如,他们可能会订阅通知。那么您的意思是,您有两个持久对象,它们将状态存储在磁盘上,并且您正试图同时使用这两个对象?如果是,您可以(a)使用所述的锁定;(b) 创建用于管理这些对象的管理器。加载和保存对象的唯一方法是通过管理器,管理器将处理传入的对象请求并同步对象状态的写入。范围太广,选项/问题太多。例如,您的数据块大小是否固定?您如何在磁盘上“删除”它们(例如,在记录上写一个哨兵/在已删除的数据块上在同一文件中稍后移动数据块/删除特定于该数据块的文件)?您是否有空闲列表或索引要保存在磁盘上?修改数据块时是否需要回调,还是轮询更新?你能承受线程阻塞多长时间?等等。如果您是新手,只需拿起一个数据库库,专注于您的应用程序代码。