我有一个指向进程虚拟内存中某个位置的指针 (IntPtr
),我需要能够以原子方式将 32 位整数写入该位置,因为可能有多个 native 线程从此位置读取/写入整数。目前我正在使用 Marshal.WriteInt32
来执行此操作,但我不确定此函数是否以原子方式写入内存。
到目前为止,我在测试过程中还没有遇到竞争条件情况,但我想确定一下。所有 Marshal.WriteInt*
函数都以原子方式写入内存吗?如果没有,我该怎么办?
最佳答案
只要内存正确对齐,
WriteInt32
将始终是原子的。在直接写入其他人的内存时,没有可以使用的同步原语,因此这确实是您唯一的选择。
但是,这仅意味着您不会在写入或读取时出现损坏 - 它并不能保证其他人会看到您写入的值。如果您需要在进程之间共享数据,只需协作即可。即使在最好的情况下,直接写入另一个进程的内存也是很棘手的,而且在大多数情况下是非常危险的。
处理同步访问的最简单方法是使用互斥锁 - 只要每个应用程序都遵循正确的协议(protocol),无论写入是否是原子的,您都是安全的。但实际上,只需使用进程之间的其他通信方法即可 - 从未支持直接内存操作。更不用说它为您的进程提供了太多的特权以供舒适:)
关于c# - 以原子方式将整数写入虚拟内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33150964/