无锁并发队列

Ham*_*yan 3 c# lock-free

此代码段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;
}
Run Code Online (Sandbox Code Playgroud)

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

axe*_*axe 5

旋转是锁。这在MSDNWikipedia和许多其他资源中都有说明。这与文字无关。无锁是一种保证。这并不意味着代码不应使用lock语句。如果可以保证系统范围内的进度,则算法是无锁的。我看不到此代码和使用锁的代码之间的任何区别。唯一的区别是,自旋使用繁忙的等待和线程产生,而不是将线程置于睡眠模式。我看不到如何保证整个系统的流程,因此我个人认为这不是无锁的实现。至少不是这个功能。

  • 无锁并不能保证系统范围内的进度;那是无需等待的。无锁表示至少有一个线程会前进而不管其他线程。 (2认同)