我一直在做一些调查,以确切了解Monitor.Enter如何在内部工作。我浏览了the code,似乎进入的实际机制是在外部函数中:
[System.Security.SecuritySafeCritical]
[ResourceExposure(ResourceScope.None)]
[MethodImplAttribute(MethodImplOptions.InternalCall)]
private static extern void ReliableEnterTimeout(Object obj, int timeout, ref bool lockTaken);
有谁知道这个函数做什么或Monitor.Enter的一般机制是什么?它是如何知道哪些对象被锁定的?
答案 0 :(得分:14)
如何知道锁定了哪些对象?
.NET中的每个对象都有两个额外的(隐藏的......你看不到它们)开销成员。
Type
实例的引用。实际上,您可以通过调用GetType()
。同步块结构包含一个可以标记为锁定的字段。基本上,当您锁定对象时,此字段将打开。当锁被释放时,它被关闭(基本上 - 我没有长时间地查看SSCLI以深入研究这种操作是如何工作的 - 我相信它基于EnterCriticalSection
但是......)
您传递给上述属性的MethodImplOptions.InternalCall
参数意味着该方法的实际实现驻留在CLR中。这就是您无法进一步浏览代码的原因。