多处理器系统中volatile关键字的成本是多少?

kol*_*osy 11 c# multithreading volatile

我们遇到了性能问题,一个潜在的罪魁祸首是集中使用易失性单例.具体代码是表单

class foo {
  static volatile instance;
  static object l = new object();

  public static foo Instance {
    if (instance == null)
      lock(l) {
        if (instance == null)
          instance = new foo();
      }

    return foo();
  }
}
Run Code Online (Sandbox Code Playgroud)

这是在一个8路的盒子上运行,我们看到上下文切换到每秒500,000的调整.典型的系统资源很好 - 25%cpu util,25%内存util,低IO,无分页等.

使用volatile字段是否会导致内存屏障或任何类型的cpu缓存重新加载?或者它只是每次都追踪主存储器,仅用于该字段?

Sku*_*del 4

lock确实会产生内存屏障,因此如果您始终访问锁中的实例,则不需要 易失性。

根据该网站

C# 易失性关键字实现获取和释放语义,这意味着读取时的读内存屏障和写入时的写入内存屏障。