【问题标题】:Thread.MemoryBarrier() and other memory fences capabilities in DNX Core 5.0DNX Core 5.0 中的 Thread.MemoryBarrier() 和其他内存栅栏功能
【发布时间】:2016-01-31 17:48:34
【问题描述】:

就我对这些技巧的理解而言,能够在 DNX 上做一个完整的全栅栏内存屏障比在标准 .Net 框架中更重要: - DNX 可能在内存模型比 x86/x64 弱的 IA64 上运行。 - Microsoft CLR 使用比 ECMA 规范定义的更强大的内存模型。

引用Why do I need a memory barrier?的回答

您将很难重现此错误。事实上,我什至会说您永远无法使用 .NET Framework 重现它。原因是因为微软的实现使用强大的内存模型进行写入。这意味着写入被视为易失性。易失性写入具有锁定释放语义,这意味着必须在当前写入之前提交所有先前的写入。

但是,ECMA 规范的内存模型较弱。因此,从理论上讲,Mono 甚至 .NET Framework 的未来版本可能会开始出现错误行为。

但是,MemoryBarrier、VolatileRead 和 VolatileWrite 均不适用于 Thread 课程。

我的问题是:

  • 这是一个确定的选择吗?
  • 什么是最好的替代方案(假设我当前的代码库使用MemoryBarrier)来实现无锁的东西?

【问题讨论】:

  • 不确定是否仍然可以购买安腾系统。但我认为 ARM 的内存模型很弱,现在 .NET Micro 至少支持 ARM。

标签: c# .net multithreading dnx memory-barriers


【解决方案1】:

实际上Thread.MemoryBarrier() 方法已移至Interlocked.MemoryBarrier()。

这种Interlocked 方法在.Net 4.5(和4.6)和DNXCORE50 上可用:这绝对是从现在开始使用的方法。

请注意,VolatileRead\Write 不可用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    相关资源
    最近更新 更多