我正在这样读取/写入内存中的全局变量:
var old = Marshal.ReadIntPtr(ptr, ofs);
Marshal.WriteIntPtr(ptr, ofs, nwv);
其中ptr是内存中的基本指针,ofs是变量偏移量,旧变量接收当前值,nwv是全局变量的新值。它运作良好,但是我想知道是否有一种原子方式来做到这一点?我知道有Interlocked.Exchange方法,该方法允许切换IntPtrs,但是我不知道如何正确地将ptr + ofs转换为ref IntPtr。 Interlocked.Exchange会自动进行IntPtrs切换吗?
答案 0 :(得分:0)
您需要一个锁来避免在“原子”动作中间使用另一种C#方法访问该位置。简化:
static object locker = new object();
lock (locker) {
//read
//write
}
一次只有一个线程可以锁定locker
。争夺该锁的其他线程将被阻塞,直到释放该锁为止。