.NET监视器具体什么时候进入内核模式? [英] When exactly does .NET Monitor go to kernel-mode?

查看:28
本文介绍了.NET监视器具体什么时候进入内核模式?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要编译使监视器进入内核模式或使用内核同步对象的所有可能条件的列表。

同步挡路有一个引用内核对象的字段。因此我推断lock有时会进入内核模式。

我发现了这个:Lock (Monitor) internal implementation in .NET

但是它有太多的问题需要回答,唯一有用的信息是OP通过简单地说明lock有时会进入内核模式来回答他自己的问题。此外,没有任何指向支持该答案的内容的链接。

lock将在什么时候进入内核模式(不是如果,也不是为什么-何时)?

我更感兴趣的是.NET 4和4.5是否与旧版本有什么不同。

摘自里希特一书:

同步挡路包含内核对象、拥有线程的ID、递归计数和等待线程计数的字段。&q;

CLR

大多数此类问题都可以通过查看SSCLI20 distribution提供的推荐答案源代码来回答。它现在已经很过时了。它是.NET2.0版本,但很多核心CLR功能没有太大变化。

您要查看的源代码文件是clr/src/vm/syncblk.cpp。这里有三个班级在起作用。AwareLock是负责获取锁的低级锁实现,SyncBlock是实现等待进入锁的线程队列的类,CLREevent是您所询问的操作系统同步对象的包装器。

这是C++代码,抽象级别相当高。这段代码与垃圾收集器进行了大量的交互,并且包含了大量的测试代码。所以我将简要描述一下这个过程。

SyncBlock具有存储AwareLock实例的m_Monitor成员。SyncBlock::Enter()直接调用AwareLock::Enter()。它首先试图以尽可能低的价格获得锁。首先检查线程是否已经拥有锁,如果是这样,则仅递增锁计数。接下来使用FastInterlockCompareExchange(),这是一个非常类似于Interlocked.CompareExchange()的内部函数。如果锁没有争用,那么它很快就会成功,并返回Monitor or.Enter()。如果没有,则另一个线程已经拥有该锁,并使用AwareLock::EnterEpilog。需要让操作系统的线程调度器参与进来,以便使用CLREevent。如有必要,将动态创建它,并调用其WaitOne()方法。这将涉及内核转换。

所以有足够的理由回答您的问题:当争用锁并且线程必须等待时,Monitor类进入内核模式。

这篇关于.NET监视器具体什么时候进入内核模式?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆