Vor*_*t3x 6 .net c# multithreading locking
c#lock关键字是否使用"让步","自旋锁定"或混合方法来处理争用?
到目前为止,我对.net锁定语句的搜索没有找到答案.如果我找到了,我会发布.到目前为止,我所能找到的是什么时候应该使用一个自旋锁...用Mecki接受的措辞很好.
但我正在寻找关于.net/c#的一些明确的答案或文件,如果有人的话.
Adr*_*tti 10
以下代码:
lock (_syncRoot)
{
// Do stuff
}
Run Code Online (Sandbox Code Playgroud)
由编译器翻译为:
Monitor.Enter(_syncRoot)
try
{
// Do stuff
}
finally
{
Monitor.Exit(_syncRoot);
}
Run Code Online (Sandbox Code Playgroud)
这是天真的(和旧的)实现,实际上使用.NET 4.0实现或多或少这个(参见Eric的博客以获得完整的参考):
bool locked = false;
try
{
Monitor.Enter(_syncRoot, ref locked);
}
finally
{
if (locked)
Monitor.Exit(_syncRoot);
}
Run Code Online (Sandbox Code Playgroud)
EDITED
那说问题是如何Monitor.Enter()
运作的?好吧,默认的Mono实现使用信号量来获取锁,但Microsoft .NET实现的行为不同.
当一个段落引起我的注意时,我正在阅读Concurrent Windows Programming(由Joe Duffy撰写),我的第一个回答说"不,它不使用旋转,因为在一般情况下性能可能不太好".正确答案是"是的,.NET Monitor
使用旋转"..NET Monitor
和Windows Critical Sections都会在回退到内核对象的真正等待之前执行短暂的旋转.这种算法被称为"两阶段锁定协议",它是合适的,因为上下文切换和内核转换是非常广泛的,在多处理器机器上旋转可以避免它们.
此外,不要忘记这些是实现细节,并且可以在任何版本中进行更改(或者由于JIT编译器,算法对于不同的硬件可能会有所不同).
归档时间: |
|
查看次数: |
2172 次 |
最近记录: |