此代码段来自here给出的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;
}


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

最佳答案

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

09-25 20:41