要掌握某些技术,您必须知道它是如何在较低的抽象级别上实现的。在多线程编程的情况下,了解同步原语会很有帮助。
这里的问题是,如何在 .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/