锁定空闲并发队列

本文关键字:队列 并发 锁定 | 更新日期: 2023-09-27 18:01:42

这个代码片段来自这里给出的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;
}

它真的没有锁而不是旋转吗?

锁定空闲并发队列

旋转是一个锁。这在MSDN、维基百科和许多其他资源中都有说明。这不是言语的问题。无锁是一个保证。这并不意味着代码不应该使用锁语句。如果保证系统范围的进度,则算法是无锁的。我看不出这段代码和使用锁的代码有什么区别。唯一的区别是,旋转使用繁忙等待和线程屈服,而不是将线程置于睡眠模式。我不明白这如何保证系统范围的进程,所以我个人认为这不是一个无锁的实现。至少不是这个函数。

Lock free表示不使用锁。旋转等待不是锁定。有许多方法可以在不使用锁的情况下同步访问数据。执行旋转等待是(众多)选项之一。并不是所有的无锁代码都会使用spin-wait。

spin将CPU置于紧循环中,而不会占用当前处理器时间的剩余部分,从而避免了用户提供的循环可能产生的问题。如果知道状态更改即将发生,这将非常有用。对于普通代码,这很少是最佳选择,对于这种特殊情况,它代表了锁定的替代

所以,是的,代码是无锁的,因为术语锁在。net框架中使用。

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