c# - .NET 中的锁定(监视)内部实现

标签 c# .net multithreading synchronization monitor

要掌握某些技术,您必须知道它是如何在较低的抽象级别上实现的。在多线程编程的情况下,了解同步原语会很有帮助。
这里的问题是,如何在 .NET 中实现 Lock (Monitor)?

我对这些点很感兴趣:
- 它是否利用操作系统对象?;
- 它需要用户模式还是内核模式?;
- 等待锁的线程的开销是多少?;
- 在什么情况下可能违反等待锁的线程队列?

更新:
“如果有多个线程争用锁,它们将排在“就绪队列”中,并以先到先得的方式授予锁。注意:Windows 和 CLR 行为的细微差别意味着队列的公平性有时会被违反。” [C# 4.0 in a Nutshell, Joseph Albahari] 所以这就是我在上一个关于“违反队列”的问题中要问的问题。

最佳答案

Wikipedia article对什么是“监视器”及其底层技术条件变量有很好的描述。

请注意,.NET Monitor 是条件变量的正确实现;大多数已发布的 CV 的 Win32 实现都是不正确的,即使是在 Dr. Dobbs 等通常信誉良好的来源中也是如此。这是因为简历 cannot easily be built from the existing Win32 synchronization primitives .

.NET CV 实现不是仅仅在 Win32 基元上构建一个浅层(和不正确的)包装器,而是利用它在 .NET 平台上的事实,实现自己的等待队列等。

关于c# - .NET 中的锁定(监视)内部实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5111779/

相关文章:

java - 使用 GWT Graphics 在 Vaadin Java 中创建新线程

c# - 如何将依赖项注入(inject) Caliburn.Micro 中的 View 模型?

c# - 在 C# 中保持已编辑 XML 文件的缩进

c# - 如何使用 Task.WaitAny() 确定哪些任务首先完成?

c# - .NET 中 Xml 序列化失败的场景

.net - 取消BackgroundWorker,如何在已经完成时防止比赛

Python 多线程 好还是不好?

java - 多线程在java程序中具体场景的适用性

c# - 多少任务太多了?

.net - 从 .NET 使用 RESt API