2013-03-01 58 views
2

此代码片段从ConcurrentQueue执行从here给出。锁定免费并发队列

internal bool TryPeek(out T result) 
{ 
    result = default(T); 
    int lowLocal = Low; 
    if (lowLocal > High) 
     return false; 
    SpinWait spin = new SpinWait(); 
    while (m_state[lowLocal] == 0) 
    { 
     spin.SpinOnce(); 
    } 
    result = m_array[lowLocal]; 
    return true; 
} 

它真的是无锁而不旋转吗?

+4

纺纱未锁定。你认为哪里锁定? – 2013-03-01 18:26:17

+2

微软大声笑 – 2013-03-01 18:27:21

+0

@ChristianStewart Aww,应该留下 - 给它一个很好的规范。 :) – JerKimball 2013-03-01 18:29:15

回答

4

纺纱是锁。这在MSDNWikipedia和许多其他资源中都有说明。 这不是关于单词。无锁是一种保证。这并不意味着代码不应该使用锁定语句。如果保证系统范围的进展,算法是lock-free。我没有看到此代码和使用锁的代码之间的任何区别。唯一的区别是旋转使用繁忙的等待和线程屈服,而不是将线程置于睡眠模式。 我不明白这是如何保证系统级进程的,所以我个人认为这不是无锁实现。至少不是这个功能。

+1

无锁并不能保证系统的进展;这是免费的。无锁说,至少有一个线程会提前,而不管其他人。 – 2016-10-08 20:38:44

3

无锁意味着不使用锁。自旋等待不锁定。有许多方法可以在不使用锁的情况下同步对数据的访问。执行旋转等待是一个(很多)选项。并非所有的无锁代码都会使用自旋等待。

+2

不,它没有。无锁意味着保证全系统的进展。调用此函数的10个线程在状态未设置时将不会执行任何进度。你甚至可能在这里住锁。无锁算法中不能同时存在死锁和活锁,这就是无锁保证的全部要点。 – axe 2013-03-01 19:42:11

2

纺纱将CPU置于一个紧密的循环中,而不会使其当前处理器的剩余时间减少,从而避免用户提供的循环可能产生的问题。如果知道状态改变即将发生,这可能很有用。这对于普通代码来说是最好的选择,并且代表替代来锁定这种特殊情况。

所以是的,因为在.NET Framework中使用了术语锁,因此代码是无锁的。

http://msdn.microsoft.com/en-us/library/hh228603.aspx