System.Threading.Monitor.Enter()如何工作?

时间:2011-07-21 02:57:39

标签: .net multithreading

我有一个问题,Monitor.Enter是如何工作的。我调查了.net框架源代码,它只显示了这一点:

    [System.Security.SecurityCritical]  // auto-generated 
    [ResourceExposure(ResourceScope.None)] 
    [MethodImplAttribute(MethodImplOptions.InternalCall)] 
    private static extern void ReliableEnter(Object obj, ref bool lockTaken);

我猜Monitor.Enter实现是依赖于平台的,所以我浏览了Mono源代码并放弃了:(

是的,为每个System.Object实例分配的关键部分可以解决,但是,我不认为实际的Monitor.Lock是这样写的,因为为每个System.Object创建一个关键部分将无限制地花费。 (Win32在进程中不允许数十亿个关键部分对象!)

有人知道Monitor.Enter是如何工作的吗?请回复。提前致谢。

2 个答案:

答案 0 :(得分:5)

查看Mono源代码,它们似乎在首次锁定对象时创建信号量(使用CreateSemaphore或类似的特定于平台的函数),并将其存储在对象中。似乎还有一些对象池正在使用信号量及其相关的MonoThreadsSync结构。

如果您感兴趣,相关功能static inline gint32 mono_monitor_try_enter_internal (MonoObject *obj, guint32 ms, gboolean allow_interruption)位于文件mono/metadata/monitor.c中。

我希望Microsoft .Net做类似的事情。

答案 1 :(得分:2)

Microsoft .NET - 尽可能 - 在对象标头中的瘦锁结构上尝试spinlock。 (注意一个人如何“锁定”任何对象。)

只有在需要时才会从池中使用事件句柄或分配新的句柄。