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

Hyu*_*Bae 8 .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);
Run Code Online (Sandbox Code Playgroud)

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

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

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

Sve*_*ven 5

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

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

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