c# - 无锁并发队列

标签 c# lock-free

此代码片段来自于 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如果有保证全系统的进展。我看不出这段代码和使用锁的代码有什么区别。唯一的区别是自旋使用忙等待和线程让出,而不是将线程置于 sleep 模式。 我看不出这如何保证系统范围的进程,所以我个人认为这不是无锁实现。至少没有这个功能。

关于c# - 无锁并发队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15164408/

相关文章:

c# - Entity Framework CreateObjectset 附加方法不更新

c# - 如何在 C# 中的一个循环中重命名多个按钮

c# - 如何删除字符串数组中的单词

java - 无锁队列哪里有bug?

delphi - 寻找无锁容器

c++ - is_lock_free() 在升级到 MacPorts gcc 7.3 后返回 false

c# - Lync sdk 自动拨号

C++Concurrency in action :Can the Listing7. 6(使用危险指针的 pop() 实现)真的检测到无法回收的节点吗?

C++ 无锁堆栈已损坏

c# - IQueryable 到 string[] 数组?