atl*_*ste 6 .net c# multithreading locking monitor
我最近想知道.NET中内部如何lock(或更具体Monitor:)在锁定的对象方面工作.具体来说,我想知道开销是什么,如果有"全局"(进程)锁使用,如果可能创建更多的全局锁(如果是这种情况)(对于监视器组)以及对象发生了什么被传递给锁(它们似乎不会引入额外的内存开销).
澄清一下我没有问的问题:我不是在问这个监视器是什么(我以前在大学做了一个).我也没有问如何使用lock,监控,他们如何编译到try/finally等; 我非常清楚这一点(还有其他与之相关的问题).这是关于内部运作的Monitor.Enter和Monitor.Exit.
例如,考虑由十个线程执行的代码:
for (int i=0; i<1000; ++i)
{
lock (myArray[i])
{
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
Monitor.Enter不是一个普通的.NET方法(不能用ILSpy或类似方法反编译).该方法由CLR内部实现,严格来说,.NET没有一个答案,因为不同的运行时可能有不同的实现.
.NET中的所有对象都有一个对象头,其中包含指向对象类型的指针,但也包含一个SyncBlock索引SyncTableEntry.通常该索引为零/未使用,但是当您锁定对象时,它将包含一个索引SyncTableEntry,然后该索引包含对实际锁定对象的引用.
因此锁定数千个对象确实会产生很多锁,这是一个开销.
我发现的信息在这篇MSDN文章中:http://msdn.microsoft.com/en-us/magazine/cc163791.aspx
| 归档时间: |
|
| 查看次数: |
1032 次 |
| 最近记录: |