锁定空闲并发队列
本文关键字:队列 并发 锁定 | 更新日期: 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