C# 监视器如何进入工作状态?

C# 监视器如何进入工作状态?,c#,thread-safety,locking,C#,Thread Safety,Locking,我一直在做一些调查,以找出Monitor.Enter在内部是如何工作的。我仔细看了一下,似乎实际的进入机制是在一个外部函数中: [System.Security.SecuritySafeCritical] [ResourceExposure(ResourceScope.None)] [MethodImplAttribute(MethodImplOptions.InternalCall)] private static extern void ReliableEnterTimeout(Object

我一直在做一些调查,以找出Monitor.Enter在内部是如何工作的。我仔细看了一下,似乎实际的进入机制是在一个外部函数中:

[System.Security.SecuritySafeCritical]
[ResourceExposure(ResourceScope.None)]
[MethodImplAttribute(MethodImplOptions.InternalCall)]
private static extern void ReliableEnterTimeout(Object obj, int timeout, ref bool lockTaken);
有人知道这个函数的作用吗?或者Monitor.Enter的一般机制是什么?它如何知道哪些对象被锁定

它如何知道哪些对象被锁定

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

  • “类型对象指针”。这只是对对象的
    类型
    实例的引用。事实上,您可以通过调用
    GetType()
    来“访问”它
  • “同步块索引”。这是一种本机字长整数类型,是CLR内部“同步块”数组的索引
同步块结构包含可标记为锁定的字段。基本上,当锁定对象时,此字段处于打开状态。当锁被释放时,它会被关闭(基本上-我没有足够长的时间研究SSCLI来深入研究这种操作是如何工作的-我相信它是基于
EnterCriticalSection


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

谢谢,我听到了一些类似的内容,但在system.object中看不到任何字段。你知道我在哪里可以找到更多关于这个的信息吗?大部分是书。CLR通过C#接触到它。。Pro.NET Performance仅提供了一页多的内容。。共享源CLI(ROTOR)有它的一个实现。。在这里,您可以找到
ReliableEnterTimeout
的实现(SSCLI会在内部将这些函数名称映射到其他函数名称。如果确实要查找它,请搜索
“ReliableEnterTimeout”
,并查看它映射到什么)。它还有一个同步块实现(尽管我一辈子都记不起该结构被调用了什么)。也许还可以看看WinAPI函数
EnterCriticalSection
。。我相信SSCLI在锁定机制的某些部分(无论如何在Windows上)使用了这种机制。它如何处理值类型,比如
inta=42;监视器。输入(a)
?@smls它们已装箱。签名是:
Monitor.Enter(Object)
。的可能重复项