C11 原子操作与内存序:构建无锁单生产者单消费者队列
深入 C11 提供的 atomic 库,重点讲解 memory_order 对 CPU 和编译器重排序的约束,实现一个高效无锁 SPSC 队列。 · 难度:入门 · +10XP
C11 原子操作与内存序:构建无锁单生产者单消费者队列
普通教程可能仅介绍 pthread 互斥锁,但无锁编程在高性能场景下至关重要。本教程聚焦 C11 标准中的 _Atomic 类型、atomic_store/load 以及不同 memory_order(relaxed, acquire, release, seq_cst)的实际效果。你将亲手实现一个无锁的单生产者单消费者(SPSC)环形缓冲区,理解为什么必须使用 release-acquire 语义来保证数据可见性,并分析错误使用 relaxed 造成的 bug。
#include
#define QUEUE_SIZE 16
struct spsc_queue {
int data[QUEUE_SIZE];
_Atomic size_t head; // 生产者写入位置
_Atomic size_t tail; // 消费者读取位置
};
// 生产者:写数据后使用 release 更新 head
// 消费者:使用 acquire 读取 head 确保数据可见
size_t head = atomic_load_explicit(&q->head, memory_order_relaxed);
q->data[head] = value;
atomic_store_explicit(&q->head, (head + 1) % QUEUE_SIZE, memory_order_release);