Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.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++ WriteProcessMemory和类似函数是否会使可能缓存的数据无效?_C++_C_Ipc - Fatal编程技术网

C++ WriteProcessMemory和类似函数是否会使可能缓存的数据无效?

C++ WriteProcessMemory和类似函数是否会使可能缓存的数据无效?,c++,c,ipc,C++,C,Ipc,我有一个现有的程序,我需要通过IPC与之通信。我可以修改它的一小部分,但不能添加任何奇特的解决方案,如共享内存、管道或套接字。因此,我想与直接读/写到程序地址空间的函数进行通信: 在linux上处理虚拟机写入 WriteProcessMemory在windows上 macOS上的mach_vm_写入 如果我使用这些函数之一修改内存中的值,旧值的缓存副本是否会失效?如果不是,一个易失性指针是否足以立即检索新值?WriteProcessMemory将很乐意按照它所说的去做。它写入内存,CPU缓存

我有一个现有的程序,我需要通过IPC与之通信。我可以修改它的一小部分,但不能添加任何奇特的解决方案,如共享内存、管道或套接字。因此,我想与直接读/写到程序地址空间的函数进行通信:

  • 在linux上处理虚拟机写入
  • WriteProcessMemory
    在windows上
  • macOS上的mach_vm_写入

如果我使用这些函数之一修改内存中的值,旧值的缓存副本是否会失效?如果不是,一个易失性指针是否足以立即检索新值?

WriteProcessMemory
将很乐意按照它所说的去做。它写入内存,CPU缓存随后将处于逻辑有效(但未指定)状态

但是,请注意,其他程序不知道这些写入。如果它有自己的缓存想法,包括在寄存器中缓存变量值等机制,那么这些副本将不会被更新。操作系统无法知道每种语言是如何实现这种缓存机制的,但性能问题决定了大多数严肃的编程语言都有这样的机制


如果写程序使用C或C++ <代码> Value指针,则部分减轻。编译器无法完全消除读取。然而,只要不可观察,这种读取可以与其他指令一起重新排序。这可能会影响它们的计时,这会产生类似于缓存的效果-您的

WriteProcessMemory
可能太晚了。

我没有使用这些功能的经验,但出于重新进入的原因,您需要一些进程间同步的方法。也许同步“东西”(共享互斥体?)包括内存障碍?必须声明整个缓冲区是不稳定的听起来有点激烈。是的,我对这个想法并不“满意”——一点也不。计时问题可能很多。即使对于1字节的信号量,我也需要修改后的值立即可供子进程使用。正如我所说的,子进程是非常有限的(在模拟器中运行)。我怀疑每个操作系统的答案都会非常不同,所以也许您可以将其限制为一个操作系统?然后,如果需要的话,问几个问题。那么,如果我通过易失性指针访问共享数据,并添加内存屏障,我就有点安全了?忽略信号量需要以原子方式读/写。@HenrikS:如果你有那个级别的控制,就建立一个合适的IPC通道。希望编译器能做你认为它可能做的事情并不是软件工程的坚实基础。