3

此代码片段来自此处ConcurrentQueue给出的实现。

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

3 回答 3

6

旋转是一把锁。这在MSDN维基百科和许多其他资源中都有说明。这与文字无关。无锁是一种保证。这并不意味着代码不应该使用 lock 语句。如果保证系统范围内的进度,则算法是无锁的。我看不出这段代码和使用锁的代码有什么区别。唯一的区别是自旋使用忙等待和线程让步,而不是将线程置于睡眠模式。我看不出这如何保证系统范围的进程,所以我个人认为这不是无锁实现。至少没有这个功能。

于 2013-03-01T19:36:53.813 回答
3

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

于 2013-03-01T18:27:18.117 回答
3

旋转将 CPU 置于一个紧密的循环中,而不会占用其当前处理器时间的其余部分,从而避免了用户提供的循环可能产生的问题。如果知道状态更改即将发生,这将很有用。这很少成为普通代码的最佳选择,并且代表了针对这种特殊情况的锁定替代方案。

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

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

于 2013-03-01T18:32:12.933 回答