在监视器 Framework4.5的.NET文档中,我找到了一个句子,它说lock关键字使用输入(对象、布尔值)方法的监视器:
Enter和Exit方法提供的功能与C# lock语句( Visual中的SyncLock )提供的功能相同,但锁和SyncLock将Enter(Object,Boolean)方法重载和Exit方法包装在…中。最后阻止(尝试…)最后,在Visual中)确保释放监视器。
另一方面,在监测器的使用中,有:
Visual和C#锁语句使用MonitorEnter获取锁,使用MonitorExit释放锁。
上面的MonitorEnter指的是与以前不同版本的Enter方法,即:输入(对象)
在线程同步(C#和Visual ) for Visual 2012中,有一个如何使用锁包装监视器的示例:
System.Object obj = (System.Object)x;
System.Threading.Monitor.Enter(obj);
try
{
DoSomething();
}
finally
{
System.Threading.Monitor.Exit(obj);
}
还有输入(对象)版本。
什么是真的?lock语句是调用输入(对象、布尔值)还是输入(对象)?究竟是怎样做的,是否有分别呢?
发布于 2013-02-22 04:15:03
回想一下
lock(obj){body}
在C# 3.0和更早的时候是一种语法糖 var temp = obj;Monitor.Enter(temp);尝试{ body }最后{ Monitor.Exit(temp);} 这里的问题是,如果编译器在监视器enter和try保护区域之间生成一个no指令,那么运行时就有可能在监视器输入之后但在try之前抛出线程中止异常。在这种情况下,最终永远不会运行,所以锁泄漏,可能最终导致程序死锁。如果这在未优化和优化的构建中是不可能的,那就太好了。 在C# 4.0中,我们更改了锁,以便它现在生成代码,就好像它是 bool lockWasTaken = false;var temp = obj;尝试{ Monitor.Enter(temp,ref lockWasTaken);{ body }最终{ if (lockWasTaken) Monitor.Exit(temp);} 这个问题现在变成了其他人的问题;Monitor.Enter的实现负责原子地设置标志,避免线程异常破坏它。 所以现在一切都很好,对吧? 遗憾的是,没有。[...]
另一方面,C# 4.0语言规范说:
窗体的锁语句 锁(x)。 其中x是引用类型的表达式,完全等价于 System.Threading.Monitor.Enter(x);最后尝试{.}{ System.Threading.Monitor.Exit(x);} 只是x只计算了一次。
https://stackoverflow.com/questions/15023862
复制