加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – lock语句使用什么类型的锁定机制

发布时间:2020-12-15 08:32:05 所属栏目:百科 来源:网络整理
导读:c#lock关键字是否使用“让步”,“自旋锁定”或混合方法来处理争用? 到目前为止,我对.net锁定语句的搜索没有找到答案. 如果我找到了,我会发布. 到目前为止,我所能找到的只有When should one use a spinlock …,Mecki接受了一个措辞得很好的答案. 但我正在寻
c#lock关键字是否使用“让步”,“自旋锁定”或混合方法来处理争用?

到目前为止,我对.net锁定语句的搜索没有找到答案.
如果我找到了,我会发布.
到目前为止,我所能找到的只有When should one use a spinlock …,Mecki接受了一个措辞得很好的答案.

但我正在寻找关于.net / c#的一些明确的答案或文件,如果有人的话.

解决方法

以下代码:
lock (_syncRoot)
{
    // Do stuff
}

由编译器翻译为:

Monitor.Enter(_syncRoot)
try
{
    // Do stuff
}
finally
{
    Monitor.Exit(_syncRoot);
}

这是天真的(和旧的)实现,实际上使用.NET 4.0实现或多或少这个(参见Eric’s blog以获得完整参考):

bool locked = false;
try
{
    Monitor.Enter(_syncRoot,ref locked);
}
finally
{
    if (locked)
        Monitor.Exit(_syncRoot);
}

EDITED

那说问题是Monitor.Enter()如何工作?好吧,默认的Mono实现使用信号量来获取锁,但Microsoft .NET实现的行为不同.

当一个段落引起我的注意时,我正在阅读Concurrent Windows Programming(由Joe Duffy撰写),我的第一个回答说“不,它不使用旋转,因为在一般情况下性能可能不太好”.正确答案是“是的,.NET Monitor使用旋转”. .NET Monitor和Windows Critical Sections都会在回退到内核对象的真正等待之前执行短暂的旋转.这种算法被称为“两阶段锁定协议”,它是合适的,因为上下文切换和内核转换是非常广泛的,在多处理器机器上旋转可以避免它们.

此外,不要忘记这些是实现细节,并且可以在任何版本中进行更改(或者由于JIT编译器,算法对于不同的硬件可能会有所不同).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读