何时在.NET中使用lock vs MemoryBarrier

Rob*_*ean 12 .net multithreading locking monitor memory-barriers

在.NET中的lock关键字是语法糖各地Monitor.EnterMonitor.Exit,所以你可以说,这段代码

lock(locker)
{
  // Do something
}
Run Code Online (Sandbox Code Playgroud)

是相同的

Monitor.Enter(locker);
try
{
  // Do Something
}
finally
{
  Monitor.Exit(locker);
}
Run Code Online (Sandbox Code Playgroud)

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

Thread.MemoryBarrier();
//Do something
Thread.MemoryBarrier();
Run Code Online (Sandbox Code Playgroud)

我很困惑,当我想用Thread.MemoryBarrierlock/ Monitor版本?我更加困惑的是线程教程,它表明它们的功能相同.

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

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

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

Jon*_*eet 22

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

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

只是作为一个例子,最近我有我的眼睛睁开的确切含义volatile,其并不 "总是从主内存中读取,总是直接写主内存".(我自己的线程教程目前仍然有解释 - 我需要在某些时候解决这个问题.)它比那更微妙.这意味着我以前的一些用途volatile可能不正确.