在.NET中,lock关键字是Monitor.EnterMonitor.Exit周围的语法糖,因此您可以说这段代码

lock(locker)
{
  // Do something
}


是相同的

Monitor.Enter(locker);
try
{
  // Do Something
}
finally
{
  Monitor.Exit(locker);
}


但是,.NET框架还包括MemoryBarrier类,该类以类似的方式工作

Thread.MemoryBarrier();
//Do something
Thread.MemoryBarrier();


我很困惑,因为我想在Thread.MemoryBarrier / lock版本上使用Monitor吗? a Threading Tutorial使我更加困惑,该状态说明它们的功能相同。

据我所见,可见的区别是不需要锁定对象,我猜想使用Monitor可以跨MemoryBarrier在单个线程上的线程做一些事情。

我的直觉告诉我,MemoryBarrier的另一个关键区别是仅适用于变量而不适用于方法。

最后,这与现有问题When to use ‘volatile’ or ‘Thread.MemoryBarrier()’ in threadsafe locking code? (C#)不相关,因为该问题着重于我理解其用法的volatile关键字。

最佳答案

在我看来,您几乎永远不要使用Thread.MemoryBarrier。这用于无锁代码-确保在一个线程上所做的更改对另一线程可见,而不会产生锁的费用。与lock不同,它不控制线程同步。我看不到Joe的教程中他说MemoryBarrierlock“功能相同”。您能解释一下您究竟从何处获得这种印象吗?

在我看来,除了主要熟练于并发的开发人员外,几乎对于任何人来说,低级无锁代码都太困难了。如果我想编写一些无锁代码,我将使用由那些开发人员构建的更高级别的构建块(例如.NET 4.0中的Parallel Extensions),而不是尝试自己开发。

举个例子,我最近对volatile的确切含义不屑一顾,它不是“总是从主存储器中读取,而总是直接写入主存储器中”。 (目前,我自己的线程教程仍具有该解释-我需要在某些时候进行修复。)It's far more subtle than that。这意味着我以前使用的volatile可能很不正确。

07-24 21:57