在.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
关键字。
答案 0 :(得分:22)
在我看来,你几乎永远不会使用Thread.MemoryBarrier
。这用于无锁代码 - 确保在一个线程上进行的更改对另一个线程可见,而不会产生锁定成本。与lock
不同,它不控制线程同步。我没有看到Joe的教程中他说MemoryBarrier
“与lock
的功能相同”。你能解释一下你到底得到的印象吗?
在我看来,除了主要熟练程度为并发性的开发人员之外,几乎所有人都认为低级无锁代码太难了。如果我想编写一些无锁代码,我会使用那些开发人员构建的内置(例如.NET 4.0中的Parallel Extensions)而不是尝试自己编译。
作为一个例子,我最近睁大了眼睛volatile
的确切含义,其中不“总是从主存储器中读取,总是直接写入主存储器”。 (我自己的线程教程目前仍然有解释 - 我需要在某些时候解决这个问题。)It's far more subtle than that。这意味着我先前使用volatile
的部分可能不正确。