Monitor.Enter如何工作?

时间:2014-05-16 04:47:04

标签: c# thread-safety locking

我一直在做一些调查,以确切了解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的一般机制是什么?它是如何知道哪些对象被锁定的?

1 个答案:

答案 0 :(得分:14)

  

如何知道锁定了哪些对象?

.NET中的每个对象都有两个额外的(隐藏的......你看不到它们)开销成员。

  • “类型对象指针”。这只是对对象的Type实例的引用。实际上,您可以通过调用GetType()
  • 来“访问”此内容
  • “同步块索引”。这是一个本机WORD大小整数类型,它是CLR内部“同步块”数组的索引。

同步块结构包含一个可以标记为锁定的字段。基本上,当您锁定对象时,此字段将打开。当锁被释放时,它被关闭(基本上 - 我没有长时间地查看SSCLI以深入研究这种操作是如何工作的 - 我相信它基于EnterCriticalSection但是......)

您传递给上述属性的MethodImplOptions.InternalCall参数意味着该方法的实际实现驻留在CLR中。这就是您无法进一步浏览代码的原因。