何时在.NET中使用lock vs MemoryBarrier

时间:2010-01-05 10:00:17

标签: .net multithreading locking monitor memory-barriers

在.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版本上使用Monitora Threading Tutorial表示他们的功能相同,让我更加困惑。

据我所知,可见的差异不需要锁定对象,我想使用Monitor你可以在MemoryBarrier在一个线程上的线程中做一些事情。

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

最后,这与现有问题When to use ‘volatile’ or ‘Thread.MemoryBarrier()’ in threadsafe locking code? (C#)无关,因为它关注的是我了解其使用情况的volatile关键字。

1 个答案:

答案 0 :(得分:22)

在我看来,你几乎永远不会使用Thread.MemoryBarrier。这用于无锁代码 - 确保在一个线程上进行的更改对另一个线程可见,而不会产生锁定成本。与lock不同,它控制线程同步。我没有看到Joe的教程中他说MemoryBarrier“与lock的功能相同”。你能解释一下你到底得到的印象吗?

在我看来,除了主要熟练程度为并发性的开发人员之外,几乎所有人都认为低级无锁代码太难了。如果我想编写一些无锁代码,我会使用那些开发人员构建的内置(例如.NET 4.0中的Parallel Extensions)而不是尝试自己编译。

作为一个例子,我最近睁大了眼睛volatile的确切含义,其中“总是从主存储器中读取,总是直接写入主存储器”。 (我自己的线程教程目前仍然有解释 - 我需要在某些时候解决这个问题。)It's far more subtle than that。这意味着我先前使用volatile部分可能不正确。