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