如何在C / Linux中实现双重比较和交换?

时间:2013-08-23 15:17:43

标签: c queue nonblocking lock-free

我正在阅读论文"Simple, fast, and practical non-blocking and blocking concurrent queue algorithms",我意识到他们认为计算机以原子方式实现了以下伪代码:

CAS(Q->Tail,tail,<next.ptr,next.count+1>)

其中Q-&gt; Tail和tail是指针和包含指针和计数器的结构的实例。

我知道gcc提供了几个用于单字比较和c中交换的内置插件。但是,是否有可能实现非阻塞原子双重比较和交换单个比较和交换c(使用Linux)?这是实现参考文献的伪代码的正确方法吗?

2 个答案:

答案 0 :(得分:0)

我不知道在两个不同的内存位置上工作的CAS操作。但是,本文可能会使用指针和计数器的结构作为一种解决方法,将两个字段视为较大的类型,因此,原子地更改它们。

假设你有两个字段的结构,一个指针和一个计数器:指针大小为4个字节,计数器大小为4个字节;在没有填充的情况下正确对齐到8字节的结构大小。假设您还有一个处理8个字节值的CAS操作(例如指向64位整数的指针)。您可以单独准备struct值,并在结构上使用CAS操作作为一个整体来一次更改两个值。

答案 1 :(得分:0)

Gcc还为双字CAS提供内置插件,如果sizeof(* Q-&gt; Tail)== sizeof(tail)== sizeof(third_arg)== 8,则可以使用__sync_bool_compare_and_swap。 因此,如果您可以在执行CAS之前增加“next.count”,一切正常。