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

如何在C/Linux中实现双比较和交换?,c,queue,nonblocking,lock-free,C,Queue,Nonblocking,Lock Free,我正在读论文,我意识到他们假设计算机以原子方式实现以下伪代码: CAS(Q->Tail,tail,<next.ptr,next.count+1>) CAS(Q->Tail,Tail,) 其中Q->Tail和Tail是指针和包含指针和计数器的结构实例 我知道gcc为c中的单字比较和交换提供了一些内置功能。但是,是否可以在c(使用Linux)中从单个比较和交换实现非阻塞原子双比较和交换?这是实现参考文献中伪代码的正确方法吗?我不知道有任何CAS操作在两个不同的内存位置上工作。但

我正在读论文,我意识到他们假设计算机以原子方式实现以下伪代码:

CAS(Q->Tail,tail,<next.ptr,next.count+1>)
CAS(Q->Tail,Tail,)
其中Q->Tail和Tail是指针和包含指针和计数器的结构实例


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

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


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

Gcc还为双字CA提供内置功能,如果sizeof(*Q->Tail)=sizeof(Tail)=sizeof(third\u arg)=8,您可以使用uu sync\u bool\u compare\u和swap。
因此,如果在执行CAS之前可以增加“next.count”,那么一切都可以正常工作。

既然我不打算买这张纸,那么
Tail
到底是什么?这真的是一个带计数器的指针吗?注:我没有读过这篇文章,只是在猜测。我可能是错的,或者可能还有其他我不知道的方法。DCAS对两个不同的操作数进行操作,但这种情况非常罕见。DWCA(doublewide)对两个相邻的值进行操作,这相当于您对一个宽度足以容纳两个较小值的CA所做的操作。