我有一个问题,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是如何工作的吗?请回复。提前致谢。
答案 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。 (注意一个人如何“锁定”任何对象。)
只有在需要时才会从池中使用事件句柄或分配新的句柄。