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

问题描述 投票:0回答:2

我正在阅读论文“简单、快速、实用的非阻塞和阻塞并发队列算法”,我意识到他们假设计算机原子地实现以下伪代码:

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

其中 Q->Tail 和 tail 是一个指针和一个包含指针和计数器的结构体实例。

我知道 gcc 提供了几个用于在 c 中进行单字比较和交换的内置函数。然而,是否有可能从c中的单个比较和交换(使用Linux)实现非阻塞原子双字比较和交换?这是实现引用论文的伪代码的正确方法吗?

c queue atomic nonblocking lock-free
2个回答
1
投票

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

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


0
投票

Gcc还提供了双字CAS的内置函数,可以使用__sync_bool_compare_and_swap,如果sizeof(*Q->Tail) == sizeof(tail) == sizeof(third_arg) == 8。 因此,如果您可以在执行 CAS 之前增加“next.count”,那么一切都会正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.