c# - 以原子方式将整数写入虚拟内存?

标签 c# multithreading

我有一个指向进程虚拟内存中某个位置的指针 (IntPtr),我需要能够以原子方式将 32 位整数写入该位置,因为可能有多个 native 线程从此位置读取/写入整数。目前我正在使用 Marshal.WriteInt32 来执行此操作,但我不确定此函数是否以原子方式写入内存。

到目前为止,我在测试过程中还没有遇到竞争条件情况,但我想确定一下。所有 Marshal.WriteInt* 函数都以原子方式写入内存吗?如果没有,我该怎么办?

最佳答案

只要内存正确对齐,

WriteInt32 将始终是原子的。在直接写入其他人的内存时,没有可以使用的同步原语,因此这确实是您唯一的选择。

但是,这仅意味着您不会在写入或读取时出现损坏 - 它并不能保证其他人会看到您写入的值。如果您需要在进程之间共享数据,只需协作即可。即使在最好的情况下,直接写入另一个进程的内存也是很棘手的,而且在大多数情况下是非常危险的。

处理同步访问的最简单方法是使用互斥锁 - 只要每个应用程序都遵循正确的协议(protocol),无论写入是否是原子的,您都是安全的。但实际上,只需使用进程之间的其他通信方法即可 - 从未支持直接内存操作。更不用说它为您的进程提供了太多的特权以供舒适:)

关于c# - 以原子方式将整数写入虚拟内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33150964/

相关文章:

c# - 从 C# 应用程序运行多个命令

c# - 处理类资源

multithreading - 有自动并行的序言实现吗?

c# - 如何正确锁定对象

c# - C# 中 Concurrency::combinable<T> 的模拟?

python - 停止 qthread 中长时间运行的进程

c# - 我可以使用 Base64String 中的 body.insertFileFromBase64 来自 doc 文件而不是 docx

c# - 如何在c#中获取系统时间格式,而不是系统时间

c# - 如何使用C#验证WebHDFS

java - 当 i++ 因同时执行的线程而损坏时,如何对情况进行建模?