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

标签 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->Tail 和 tail 是指针和包含指针和计数器的结构的实例。

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

最佳答案

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

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

关于c - 如何在C/Linux中实现双重比较和交换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18406352/

相关文章:

java - 轻量级 JMS 选择器替代方案

c# - 简单的异步等待 tcp 服务器设计

javascript - 如何在 Angular 2/4 中启动匿名异步函数?

c - MPI 集体操作和进程生命周期 (C/C++)

c - 我需要生成一组97到122之间的随机数

php - 清除 Laravel 5.x/6.x/7.x/8+ 中 Redis 中的 Laravel 排队作业

mysql - 是否可以在 Django 应用程序中进行异步/并行数据库查询?

c - 如何计算 X.509 证书的 SHA-1 指纹?

c - 为什么 GCC 的 -Wconversion 对于 char 与 unsigned char 的行为不同?

c++ - 迭代器声明 : "does not contain a type"