gpt4 book ai didi

c# - .NET Monitor 何时进入内核模式?

转载 作者:太空狗 更新时间:2023-10-29 18:06:45 24 4
gpt4 key购买 nike

我想编制一个列表,列出所有可能使 Monitor 进入内核模式或使用内核同步对象的条件。

同步块(synchronized block)有一个引用内核对象的字段。因此我推断 lock 有时会进入内核模式。

我找到了这个: Lock (Monitor) internal implementation in .NET

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

lock 到底什么时候会进入内核模式(不是 if 也不是 why - 什么时候)?

如果 .NET 4 和 4.5 与旧版本有任何区别,我更有兴趣了解它。

来自 Richter 的书:“同步块(synchronized block)包含内核对象的字段、拥有线程的 ID、递归计数和等待线程计数。”

最佳答案

通过查看 SSCLI20 distribution 提供的 CLR 源代码,可以回答大多数此类问题。 .它现在已经过时了。它是 .NET 2.0 版本,但许多核心 CLR 功能并没有太大变化。

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

这是C++代码,抽象度很高。此代码与垃圾收集器大量交互,并且包含大量测试代码。因此,我将简要说明该过程。

SyncBlock 具有存储 AwareLock 实例的 m_Monitor 成员。 SyncBlock::Enter() 直接调用 AwareLock::Enter()。它首先尝试尽可能便宜地获取锁。首先检查线程是否已经拥有锁,如果是这种情况,则只增加锁计数。接下来使用 FastInterlockCompareExchange(),这是一个与 Interlocked.CompareExchange() 非常相似的内部函数。如果锁没有争用,那么这很快就会成功并且 Monitor.Enter() 返回。如果不是,那么另一个线程已经拥有锁,并且使用 AwareLock::EnterEpilog。需要让操作系统的线程调度程序参与进来,因此使用了 CLREvent。如有必要,它会动态创建并调用其 WaitOne() 方法。这将涉及内核转换。

因此足以回答您的问题:当锁被争用且线程必须等待时,Monitor 类进入内核模式。

关于c# - .NET Monitor 何时进入内核模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14922437/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com