【问题标题】:ReadProcessMemory and WriteProcessMemory atomicityReadProcessMemory 和 WriteProcessMemory 原子性
【发布时间】:2014-04-11 17:54:26
【问题描述】:

ReadProcessMemory()WriteProcessMemory() 在从正确对齐的内存位置读取/写入机器字(32 位模式下为 32 位,64 位模式下为 64 位)时是原子的吗?

PS。 SO中有一个标签“readprocessmemory”,但没有标签“writeprocessmemory”。也许它应该由拥有足够权限的人创建?

【问题讨论】:

  • Windows 不提供任何保证。仍然是原子的,处理器保证它。无法保证进程中的代码实际上可以看到更新,您在完全没有任何同步的情况下戳内存。除非你添加它。
  • 没有原子性保证。它可以合法地逐字节复制内存。 (对于小型缓冲区,它可能会。)

标签: winapi


【解决方案1】:

如果 MSDN 没有声明它们在对齐的机器字读取和写入上提供原子性(它没有),那么它们不会;即使它们的底层实现确实如此,无论是通过硬件还是软件机制,你都不能依赖它,对于我在 I-cache 中并且必须用FlushInstructionCache 刷新的代码来说尤其如此。

如果你想要一个原子读/写,你需要明确地使用一个,结合VirtualProtect,如果你在自己的地址空间之外写,可能还有一些额外的技巧(即:到被调试者的地址空间)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 2014-06-27
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多