此代码段来自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;
}
它真的无锁而不是旋转吗?
答案 0 :(得分:4)
旋转是一种锁定。这在MSDN,Wikipedia和许多其他资源中都有说明。 这不是关于单词的。无锁是一种保证。这并不意味着代码不应该使用lock语句。如果有保证的系统范围进度,则算法为lock-free。我没有看到此代码与使用锁的代码之间有任何区别。唯一的区别是旋转使用忙等待和线程产生而不是将线程置于睡眠模式。 我不知道这如何保证系统范围的进程,所以我个人认为这不是一个无锁的实现。至少不是这个功能。
答案 1 :(得分:3)
无锁意味着不使用锁。 Spinwaiting没有锁定。有许多方法可以在不使用锁的情况下同步数据访问。执行旋转等待是一个(很多)选项。并非所有无锁代码都会使用spin-wait。
答案 2 :(得分:2)
旋转将CPU置于紧密循环中,而不会产生剩余的当前处理器时间片,从而避免用户提供的循环可能产生的问题。如果知道状态变化迫在眉睫,这可能很有用。对于普通代码来说,它很少是最佳选择,并代表替代来锁定这种特殊情况。
所以是的,代码是无锁的,因为在.NET Framework中使用了术语锁。