c# - 在方法开始时使用Volatile.Write的原因

标签 c# .net multithreading volatile spinlock

我想我有点了解Volatile.WriteVolatile.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/

相关文章:

c# - 如何使我创建的类或 DLL 出现在 VS 工具箱中

c# - Roslyn 会成为 .NET 框架的一部分吗?

c# - 静态 ImmutableArray 未初始化

java - 为什么 ThreadPoolExecutor 使用 HashSet 来维护对其工作线程的引用?

c# - 为什么 Application.Exit() 不退出 Windows 窗体应用程序?

c# - .Net RX : tracking progress of parallel execution

c# - C# 4.0 以及可选参数和重载的组合是否会向您发出有关歧义的警告?

.net - 数据导出表单在文件打开期间/之后偶尔会卡住

java 男女通用浴室

java - 为一个具有硬限制保证的线程使用执行程序是否有意义?