中。净的 lock 关键字是语法糖周围 Monitor.EnterMonitor.Exit, 所以你可以说这个代码

lock(locker)
{
  // Do something
}

是一样的

Monitor.Enter(locker);
try
{
  // Do Something
}
finally
{
  Monitor.Exit(locker);
}

但是的.净框架还包括 MemoryBarrier 类的其工作方式类似

Thread.MemoryBarrier();
//Do something
Thread.MemoryBarrier();

我很困惑因为当我想要使用 Thread.MemoryBarrierlock/Monitor 版本吗?我更加的困惑 一个线程教程 各国它们所相同。

尽我所能看到的可见差异不是需要一个锁定的对象,这是我的猜测,使用 Monitor 你可以做一些跨线在哪里 MemoryBarrier 是在一个单一的线。

我的直觉告诉我这的另一个关键差别是 MemoryBarrier 是变量,而不是只对方法。

最后,这是不相关的现有问题 当对使用挥发性'或'线。MemoryBarrier()'在线程安全锁码?(C#), ,因为这是重点 volatile 关键词,这我理解其使用情况。

有帮助吗?

解决方案

我认为你应该差不多 从来没有 使用 Thread.MemoryBarrier.这是用于 锁定 代码-确保作出的改变上一个线都可以看到另一个没有招致费用的锁。它不会 控制线的同步,不同 lock.我看不到哪儿在乔的教程,他说, MemoryBarrier "功能相同"作为 lock.你能解释究竟在哪里你得到这样的印象?

在我看来,低级锁码是太困难的几乎任何人比其他开发人员其主要能力是发。如果我要编写一些无锁码,我会用更高级别的构建模块 通过这些开发商(如并行扩展。净4.0),而不是试图推我自己的。

只是作为一个例子,我最近有我的眼睛打开的精确意义 volatile是不是 "总是从中读取的主存储器,总是直接写信给主存储器".(我自己穿的教程仍然具有解释的那一刻-的东西我需要解决在某一点。) 这是更为微妙,比,.这意味着 一些 我以前使用的 volatile 很可能是不正确的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top