gpt4 book ai didi

c# - `lock`(监视器)在 .NET 中如何工作?

转载 作者:太空狗 更新时间:2023-10-29 21:27:56 24 4
gpt4 key购买 nike

我最近一直想知道 lock(或更具体地说:Monitor)在 .NET 中如何针对被锁定的对象在内部工作。具体来说,我想知道开销是多少,是否使用了“全局”(进程)锁,如果是这种情况(对于监视器组)是否有可能创建更多这些全局锁,以及对象会发生什么被传递给锁(它们似乎没有引入额外的内存开销)。

澄清一下我不是在问什么:我不是在这里问 Monitor 是什么是(我前段时间在大学里自己做了一个)。我也不是在问如何使用 lock、Monitor、它们如何编译为 try/finally 等等;我很清楚这一点(还有其他与此相关的 SO 问题)。这是关于 Monitor.EnterMonitor.Exit内部工作

例如,考虑由十个线程执行的这段代码:

for (int i=0; i<1000; ++i) 
{
lock (myArray[i])
{
// ...
}
}
  • 锁定一千个对象而不是一个对象不好吗?对性能/内存压力有何影响?
  • 底层监视器创建一个等待队列。是否可以有多个等待队列?我将如何创建它?

最佳答案

Monitor.Enter 不是普通的 .NET 方法(无法使用 ILSpy 或类似工具进行反编译)。该方法由 CLR 在内部实现,因此严格来说,.NET 没有唯一的答案,因为不同的运行时可以有不同的实现。

.NET 中的所有对象都有一个对象 header ,其中包含指向对象类型的指针,还有一个指向 SyncTableEntrySyncBlock 索引。通常该索引为零/未使用,但当您锁定该对象时,它将包含 SyncTableEntry 的索引,然后包含对实际锁定对象的引用。

因此锁定数千个对象确实会创建很多锁,这是一种开销。

我找到的信息是在这篇 MSDN 文章中:http://msdn.microsoft.com/en-us/magazine/cc163791.aspx

关于c# - `lock`(监视器)在 .NET 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21039917/

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