12

在 .NET 中,关键字是andlock周围的语法糖,所以你可以说这段代码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一个线程教程让我更加困惑,它指出它们的功能相同。

据我所见,明显的区别是不需要锁定对象,我想使用Monitor它可以MemoryBarrier在单个线程上跨线程执行某些操作。

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

最后,这与现有问题何时在线程安全锁定代码中使用 'volatile' 或 'Thread.MemoryBarrier()' 无关?(C#),因为它专注于volatile我理解其用法的关键字。

4

1 回答 1

22

在我看来,您几乎应该使用Thread.MemoryBarrier. 这用于无锁代码 - 确保在一个线程上所做的更改对另一个线程可见,而不会产生锁定成本。它不控制线程同步,不像lock. 我没有看到乔的教程中他说MemoryBarrier“功能相同”的地方lock。你能解释一下你到底是从哪里得到这种印象的吗?

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

举个例子,我最近睁大了眼睛,volatile它的确切含义不是“总是从主存储器读取,总是直接写入主存储器”。(我自己的线程教程目前仍然有这个解释——我需要在某个时候修复它。)它远比那更微妙。这意味着我之前的一些使用volatile很可能是不正确的。

于 2010-01-05T10:04:25.600 回答