在.NET中,lock
关键字是Monitor.Enter
和Monitor.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的教程中他说MemoryBarrier
与lock
“功能相同”。您能解释一下您究竟从何处获得这种印象吗?
在我看来,除了主要熟练于并发的开发人员外,几乎对于任何人来说,低级无锁代码都太困难了。如果我想编写一些无锁代码,我将使用由那些开发人员构建的更高级别的构建块(例如.NET 4.0中的Parallel Extensions),而不是尝试自己开发。
举个例子,我最近对volatile
的确切含义不屑一顾,它不是“总是从主存储器中读取,而总是直接写入主存储器中”。 (目前,我自己的线程教程仍具有该解释-我需要在某些时候进行修复。)It's far more subtle than that。这意味着我以前使用的volatile
可能很不正确。