我想我有点了解Volatile.Write
和Volatile.Read
的确切功能,但是我已经看到一些示例,其中在C#中通过C#书的方法开头使用Volatile.Write
,其中Jeffrey展示了如何使用Interlocked
实现简单自旋锁。这是代码:
struct SimpleSpinLock {
private int _resourceInUse; // 0 = false, 1 = true
public void Enter() {
while (true) {
if (Interlocked.Exchange(ref _resourceInUse, 1) == 0) return;
}
}
public void Leave() {
Volatile.Write(ref _resourceInUse, 0); // Why is it here??
}
}
这是假定使用该类的方式:
class SomeResource {
private SimpleSpinLock _s1 = new SimpleSpinLock();
public void AccessResource() {
_s1.Enter();
// Some code that only one thread at a time can get in..
_s1.Leave();
}
}
因此,据我所知,
Volatile.Write
用于保证位于其上方的指令将在Volatile.Write
之前准确执行。但是在Leave
方法中只有一条指令,在这里使用Volatile.Write
的原因是什么?大概我理解事情完全错了,所以如果有人可以引导我走正确的道路,我将不胜感激。
最佳答案
不会声称我有足够的脑力来完全理解/解释这一点,但这是我的5美分。首先,编译器可以内联Leave
方法调用,因为它仅由一行组成,因此实际写入可以被其他指令包围。接下来是 Volatile
class docs状态(主要是我想):
On a multiprocessor system, a volatile write operation ensures that a value written to a memory location is immediately visible to all processors.
因此,此
Volatile.Write
调用的目标是尽快使其他处理器看到更改。另请参阅this问题的答案并阅读有关
volatile
keyword的信息
关于c# - 在方法开始时使用Volatile.Write的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61664198/