Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指针的多实例共享_C++_Pointers_Instance - Fatal编程技术网

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) 创建用于管理这些对象的管理器。加载和保存对象的唯一方法是通过管理器,管理器将处理传入的对象请求并同步对象状态的写入。范围太广,选项/问题太多。例如,您的数据块大小是否固定?您如何在磁盘上“删除”它们(例如,在记录上写一个哨兵/在已删除的数据块上在同一文件中稍后移动数据块/删除特定于该数据块的文件)?您是否有空闲列表或索引要保存在磁盘上?修改数据块时是否需要回调,还是轮询更新?你能承受线程阻塞多长时间?等等。如果您是新手,只需拿起一个数据库库,专注于您的应用程序代码。