无锁队列的C代码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无锁队列的C代码相关的知识,希望对你有一定的参考价值。

我怎样才能在C中实现这个无锁队列伪代码?

ENQUEUE(x)
    q ← new record
    q^.value ← x
    q^.next ← NULL
    repeat
        p ← tail
        succ ← COMPARE&SWAP(p^.next, NULL, q)
        if succ ≠ TRUE
            COMPARE&SWAP(tail, p, p^.next)
    until succ = TRUE
    COMPARE&SWAP(tail,p,q)
end

DEQUEUE()
    repeat
        p ← head
        if p^.next = NULL
            error queue empty
    until COMPARE&SWAP(head, p, p^.next)
    return p^.next^.value
end

如何使用Built-in functions for atomic memory access

__sync_bool_compare_and_swap (type *ptr, type oldval type newval, ...)

我现在有

typedef struct queueelem {
    queuedata_t data;
    struct queueelem *next;
} queueelem_t;

typedef struct queue {
    int capacity;
    int size;
    queueelem_t *head;
    queueelem_t *tail;
} queue_t;

queue_t *
queue_init(int capacity)
{
    queue_t *q = (queue_t *) malloc(sizeof(queue_t));
    q->head = q->tail = NULL;
    q->size = 0;
    q->capacity = capacity;
    return q;
}
答案

http://www.liblfds.org

公共领域,无许可证,C中无锁算法的可移植实现。

为Windows和Linux开箱即用。

在Linux上使用GCC,因此使用内在函数(除了128位CAS之外,没有内在函数 - 使用内联汇编)。

包含M&S队列。看看源代码,看看它是如何完成的。

另一答案

如果您的目标是生产代码,那就不要这样做;使用锁。

your previous question,你有足够的信息解释原因。由于the (in)famous ABA problem,在没有垃圾收集器的情况下,即使是简单的数据结构(如队列和堆栈)的正确无锁实现也很棘手且复杂。不幸的是,一些研究论文无论出于何种原因都不考虑ABA;你的伪代码似乎来自其中一篇论文。如果将它转换为C并为节点使用堆分配的内存,如果在实际代码中使用它将导致不确定的错误。

如果你正在做这些事情以获得经验,那么不要指望SO伙伴为你解决它。您必须阅读所有引用的材料等等,确保您真正了解ABA等无锁算法的所有细微差别,研究旨在解决该问题的各种技术,研究现有的无锁实现等。

最后,很少有指导将给定的伪代码转换为C:

q^.value ← x意味着q_elem->data = x; repeat ... until COMPARE&SWAP(head, p, p^.next)相当于do {...} while (!__sync_bool_compare_and_swap(q_obj->head, q_elem, q_elem->next);

其中q_objqueue_t类型的实例(即队列),q_elemqueueelem_t类型的实例(即队列节点)。

另一答案

虽然不完全是C,但请查看proposed Boost.Lockfree库。内部很容易理解,可以移植到C,或者相反,你可以将Boost.Lockfree包装在C API中并使用它。

同样,Boostcon 2010有很多关于无锁编程和STM的讨论,如果你对这个主题感兴趣,值得一看。我无法找到视频的链接,但英特尔,IBM和AMD的谈话值得关注,因为他们在CPU级别处理STM。

另一答案

这听起来像你想要的被称为MCS队列锁(虽然看似命名,它真的无锁,只是没有等待),并且这里有一些很好的伪代码:http://www.cs.rochester.edu/research/synchronization/pseudocode/ss.html#mcs

另一答案

我使用C编写一个最小化无锁队列实现。

lfq

它支持许多生产者,许多消费者。

以上是关于无锁队列的C代码的主要内容,如果未能解决你的问题,请参考以下文章

多线程编程之无锁队列

CAS无锁队列的实现

高性能无锁队列,代码注释

无锁队列的实现

是否存在乐观的无锁FIFO队列实现?

c++11 2线程无锁队列