我正在阅读论文 "Simple, fast, and practical non-blocking and blocking concurrent queue algorithms"我意识到他们假设计算机自动执行以下伪代码:
CAS(Q->Tail,tail,<next.ptr,next.count+1>)
其中 Q->Tail 和 tail 是指针和包含指针和计数器的结构的实例。
我知道 gcc 为 c 中的单个单词比较和交换提供了几个内置函数。但是,是否可以在 c 中(使用 Linux)从单个比较和交换实现非阻塞原子双重比较和交换?这是实现引用论文伪代码的正确方法吗?
最佳答案
我不知道有任何 CAS 操作可以在两个不同的内存位置上工作。但是,这篇论文有可能使用指针和计数器的结构作为一种变通方法,将这两个字段视为更大的类型,因此,以原子方式更改两者。
假设您有一个包含两个字段的结构,一个指针和一个计数器:指针大小为 4 个字节,计数器大小为 4 个字节;正确对齐,无需填充到 8 字节的结构大小。假设您还有一个处理 8 字节值的 CAS 操作(例如指向 64 位整数的指针)。您可以分别准备结构值,并在结构上使用 CAS 操作作为一个整体来一次更改两个值。
关于c - 如何在C/Linux中实现双重比较和交换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18406352/