当使用锁vs MemoryBarrier。净
-
18-09-2019 - |
题
中。净的 lock
关键字是语法糖周围 Monitor.Enter
和 Monitor.Exit
, 所以你可以说这个代码
lock(locker)
{
// Do something
}
是一样的
Monitor.Enter(locker);
try
{
// Do Something
}
finally
{
Monitor.Exit(locker);
}
但是的.净框架还包括 MemoryBarrier
类的其工作方式类似
Thread.MemoryBarrier();
//Do something
Thread.MemoryBarrier();
我很困惑因为当我想要使用 Thread.MemoryBarrier
在 lock
/Monitor
版本吗?我更加的困惑 一个线程教程 各国它们所相同。
尽我所能看到的可见差异不是需要一个锁定的对象,这是我的猜测,使用 Monitor
你可以做一些跨线在哪里 MemoryBarrier
是在一个单一的线。
我的直觉告诉我这的另一个关键差别是 MemoryBarrier
是变量,而不是只对方法。
最后,这是不相关的现有问题 当对使用挥发性'或'线。MemoryBarrier()'在线程安全锁码?(C#), ,因为这是重点 volatile
关键词,这我理解其使用情况。
解决方案
我认为你应该差不多 从来没有 使用 Thread.MemoryBarrier
.这是用于 锁定 代码-确保作出的改变上一个线都可以看到另一个没有招致费用的锁。它不会 不 控制线的同步,不同 lock
.我看不到哪儿在乔的教程,他说, MemoryBarrier
"功能相同"作为 lock
.你能解释究竟在哪里你得到这样的印象?
在我看来,低级锁码是太困难的几乎任何人比其他开发人员其主要能力是发。如果我要编写一些无锁码,我会用更高级别的构建模块 建 通过这些开发商(如并行扩展。净4.0),而不是试图推我自己的。
只是作为一个例子,我最近有我的眼睛打开的精确意义 volatile
哪 是不是 "总是从中读取的主存储器,总是直接写信给主存储器".(我自己穿的教程仍然具有解释的那一刻-的东西我需要解决在某一点。) 这是更为微妙,比,.这意味着 一些 我以前使用的 volatile
很可能是不正确的。